EQVPS
DashibodiAnza

Jinsi ya kupanga kazi kwenye VPS kwa cron na timer za systemd

Endesha backup, usafishaji na skripti kwa ratiba. Cron kwa dakika tano pamoja na mitego mitatu inayoharibu kazi kimya kimya, kisha timer za systemd kwa kumbukumbu, kufidia baada ya seva kuzimwa na muda kamili. Kila tabia hapa chini ilijaribiwa kwenye seva mpya ya Ubuntu 24.04.

Seva hujilipia kwa kufanya kazi ukiwa umelala: backup, mzunguko wa kumbukumbu, kufanya upya vyeti, ripoti saa tatu asubuhi. Linux ina vipanga ratiba viwili kwa hili. Cron ina miaka arobaini na inahitaji mstari mmoja. Timer za systemd zinahitaji faili mbili ndogo, na kwa malipo zinatoa kumbukumbu, kufidia baada ya kuzimwa na muda kamili. Mwongozo huu unashughulikia vyote viwili kwenye Ubuntu 24.04, kila tabia ikiwa imekaguliwa kwenye seva mpya kutoka image yetu, pamoja na makosa matatu yanayofanya kazi ya cron ishindwe bila neno.

Unahitaji mtumiaji mwenye sudo; mwongozo wa kusanidi Ubuntu unamuunda.

1. Cron kwa dakika tano

Cron imesakinishwa na inaendeshwa kwenye image zetu za Ubuntu na Debian. Kila mtumiaji ana jedwali la kazi; hariri lako kwa:

crontab -e

Kila mstari ni sehemu tano za muda na amri:

# min hour day month weekday  command
  30  3    *   *     *        /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
  */5 *    *   *     *        /usr/local/bin/check.sh
  0   9    *   *     1-5      /usr/local/bin/report.sh
  @reboot                     /usr/local/bin/start-tunnel.sh

Yaani: saa 03:30 kila usiku, kila dakika 5, saa 09:00 siku za kazi, na mara moja baada ya kila kuwasha. */5 ni kila thamani ya tano, 1-5 ni masafa, 1,15 ni orodha. Saa za eneo za seva ndizo zinatumika, UTC kwenye image zetu; weka zako mara moja kwa mwongozo wa jina la mwenyeji na saa za eneo na cron itazifuata.

Kagua kilichoendeshwa kwa journalctl -u cron. Kila mzunguko huandika mtumiaji na amri, na hapo ndipo mitego mitatu inajitokeza.

Mtego 1: matokeo hupotea. Cron hutuma matokeo ya kazi kwa mtumiaji kwa barua pepe. Image yetu haina seva ya barua, kwa hiyo journal iliandika (CRON) info (No MTA installed, discarding output) na matokeo yalipotea. Yaelekeze mwenyewe, kama mfano wa kwanza unavyofanya kwa >> /var/log/backup.log 2>&1.

Mtego 2: alama ya asilimia. Kwenye crontab, % humaliza amri na kugeuza kinachobaki kuwa ingizo la kawaida. Tulipanga date +%F > /tmp/today. Journal inaonyesha kile cron ilichoendesha kweli: CMD (date +). Hakuna faili iliyoandikwa na hakuna hitilafu iliyotufikia. Andika \%, au weka amri kwenye skripti na upange skripti.

Mtego 3: mazingira tofauti. Cron huendesha kazi kwa /bin/sh, si bash, kwenye saraka yako ya home na kwa mazingira finyu. Kwenye Ubuntu 24.04 PATH ilikuwa bora kuliko sifa yake: njia kamili ya mfumo ikiwemo /usr/local/bin na /snap/bin, kwa root na kwa mtumiaji wa kawaida. Kinachokosekana bado ni kila kitu chini ya home yako: ~/.local/bin, node ya nvm, pipx, cargo. Tumia njia kamili kwenye kazi au anza mstari kwa . $HOME/.profile;.

Kazi za mfumo badala ya mtumiaji huwekwa kwenye /etc/cron.d/ kama faili yenye sehemu moja ya ziada, mtumiaji:

30 3 * * * root /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

Ubuntu pia huendesha kila kitu kwenye /etc/cron.hourly, cron.daily, cron.weekly na cron.monthly, dakika ya 17 ya kila saa, saa 06:25, Jumapili saa 06:47 na tarehe 1 saa 06:52. Weka skripti inayotekelezeka hapo na itaendeshwa pamoja na nyingine.

2. Timer za systemd

Timer ni unit mbili: huduma inayofanya kazi na timer inayosema lini. Unda skripti kwanza, kisha unit.

sudo nano /usr/local/bin/backup.sh
sudo chmod +x /usr/local/bin/backup.sh
sudo nano /etc/systemd/system/backup.service
[Unit]
Description=Nightly backup

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
sudo nano /etc/systemd/system/backup.timer
[Unit]
Description=Run the backup every night at 03:30

[Timer]
OnCalendar=*-*-* 03:30
Persistent=true
AccuracySec=1m

[Install]
WantedBy=timers.target

Washa timer, si huduma:

sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
systemctl list-timers backup.timer

list-timers inaonyesha mzunguko unaofuata, muda uliobaki hadi huo na mzunguko wa mwisho. Kumbukumbu hazihitaji kusanidiwa: journalctl -u backup.service ina kila mwanzo, kila mwisho na kila mstari wa matokeo pamoja na muda. Ili kuendesha kazi sasa hivi, sudo systemctl start backup.service; hivyo pia ndivyo unavyojaribu skripti kabla ya kuamini ratiba.

Sintaksia ya kalenda. OnCalendar husomwa siku-ya-wiki mwaka-mwezi-siku saa:dakika:sekunde, * ikiwa thamani yoyote. Jaribu usemi kabla ya kuutumia:

systemd-analyze calendar "Mon..Fri *-*-* 03:00" --iterations 2

Huchapisha muundo uliosawazishwa na tarehe zinazofuata. Baadhi ya semi tulizokagua:

OnCalendarMaana
*-*-* 03:30Kila siku saa 03:30
Mon..Fri *-*-* 09:00Siku za kazi saa 09:00
*:0/15Kila dakika 15
weeklyJumatatu saa 00:00
*-*-01 04:00Tarehe 1 ya kila mwezi saa 04:00
*-*-* 03:00 Europe/Kyiv03:00 kwa saa za Kyiv; kwetu iliendeshwa saa 01:00 UTC

Mipangilio mitatu inayofaa kujua. Persistent=true huhifadhi mzunguko wa mwisho kwenye diski na hufidia mzunguko uliokosekana seva ikiwa imezimwa au timer imesimamishwa. Tulisimamisha timer yetu ya kila dakika mbili, tukasubiri mzunguko uliopangwa upite, kisha tukaiwasha tena: mzunguko uliokosekana ulianza ndani ya sekunde ile ile. Bila Persistent, inasubiri tu nafasi inayofuata.

AccuracySec ndio mshangao. Kwa chaguomsingi systemd hukusanya timer ndani ya dirisha la dakika moja ili kuokoa kuamsha mfumo, kwa hiyo mzunguko wetu wa kwanza ulikuja saa 07:42:18, si 07:42:00. Kwa AccuracySec=1s mizunguko iliyofuata iliangukia sekunde kamili 07:46:00 na 07:48:00. Iweke dakika inapokuwa muhimu; acha chaguomsingi kwa backup ya usiku.

RandomizedDelaySec=10m hufanya kinyume kwa makusudi: husambaza mwanzo ndani ya dirisha ili seva kumi zisigonge hifadhi moja ya backup kwa sekunde ile ile.

Kwa kazi ya mara moja, hakuna faili linalohitajika:

sudo systemd-run --on-active=30m --unit=cleanup-once /usr/local/bin/cleanup.sh

Huunda timer ya muda inayoendeshwa mara moja kisha kutoweka; hadi wakati huo systemctl list-timers inaionyesha.

3. Ipi utumie

CronTimer ya systemd
KusanidiMstari 1Faili 2
KumbukumbuUkielekeza matokeo tujournalctl -u name.service
Mzunguko uliokosekana seva ikiwa imezimwaUmepoteaHuendeshwa wakati wa kuwasha kwa Persistent=true
Kazi bado inaendelea kwenye mzunguko unaofuataNakala ya pili huanzaInarukwa hadi ya kwanza imalize
Muda kamiliHadi dakikaHadi sekunde kwa AccuracySec=1s
HaliHakunalist-timers, systemctl status

Tumia cron kwa mstari wa haraka utakaoutambua hata baada ya mwaka. Tumia timer kwa chochote ambacho unahitaji kuona kikishindwa, kisichopaswa kupishana au kinachopaswa kuendeshwa baada ya kuwasha upya kulikokosekana: backup, kufanya upya vyeti, kusafisha hifadhidata. Ikiwa kazi ya cron inaweza kupishana, ifunge: flock -n /tmp/backup.lock /usr/local/bin/backup.sh, na nakala ya pili hutoka mara moja.

Vipanga ratiba vyote viwili huanzisha kazi kisha husimama. Kwa programu inayopaswa kuendeshwa saa zote na kurudi baada ya kuanguka, unahitaji huduma, si ratiba; angalia jinsi ya kuunda huduma ya systemd na kwa Windows jinsi ya kuendesha skripti 24/7 kwenye Windows Server. Timer nzuri ya kwanza ni ile kutoka mwongozo wetu wa backup kwa restic; masasisho ya usalama ya kiotomatiki ni timer ambayo Ubuntu tayari inaileta, apt-daily-upgrade.timer, moja ya 17 zinazoendeshwa kwenye seva mpya.

Maswali

Kwa nini kazi yangu inafanya kazi kwenye terminal lakini si kwenye cron?

Sababu tatu za kawaida. Cron huendesha kazi kwa sh, si bash, kwa hiyo sintaksia ya bash pekee inashindwa. Zana zilizosakinishwa kwenye saraka yako ya home, kama nvm, pipx au cargo, hazipo kwenye PATH ya cron, kwa hiyo tumia njia kamili. Na kila % kwenye mstari wa amri humaliza amri: kwenye seva yetu date +%F ikawa date +. Iandike kama \% au hamisha amri kwenye skripti.

Matokeo ya cron huenda wapi?

Kwa barua pepe, kwa chaguomsingi. Image yetu haina seva ya barua, kwa hiyo cron huandika 'No MTA installed, discarding output' na matokeo hupotea. Ongeza >> /var/log/myjob.log 2>&1 kwenye kazi, au hamia timer ya systemd ambayo matokeo yake huingia kwenye journal yenyewe.

Timer ya systemd ina faida gani kuliko cron?

Kumbukumbu kwenye journalctl, hakuna nakala ya pili ya kazi ambayo bado inaendelea, kufidia kwa Persistent=true kwa mizunguko iliyokosekana seva ikiwa imezimwa, na mstari wa hali unaoonyesha mzunguko unaofuata na wa mwisho. Cron inashinda kwa ufupi: mstari mmoja badala ya faili mbili.

Timer yangu ilichelewa sekunde 18. Kwa nini?

Kwa chaguomsingi systemd hukusanya timer ndani ya dirisha la dakika moja ili kuokoa kuamsha mfumo; hiyo ndiyo mipangilio AccuracySec. Timer yetu ya kila dakika mbili iliendeshwa saa 07:42:18 badala ya 07:42:00. Kwa AccuracySec=1s iliendeshwa saa 07:46:00 kamili. Iweke dakika kamili inapokuwa muhimu.

Cron na timer hutumia saa za eneo gani?

Za seva, ambazo ni UTC kwenye image zetu. Ziweke mara moja kwa timedatectl, angalia mwongozo wetu wa jina la mwenyeji na saa za eneo, na cron na timer zitazifuata. Timer inaweza pia kuwa na eneo lake: OnCalendar=*-*-* 03:00 Europe/Kyiv iliendeshwa saa 01:00 UTC kwenye jaribio letu.

Maoni

Bado hakuna maoni. Kuwa wa kwanza.

Acha maoni

Maoni yanakaguliwa kabla ya kuonekana.