Mwongozo

Crontab: mifano ya ratiba ya kazi kwenye Linux, sintaksia na makosa ya kawaida

Imesasishwa: · Skillaria.Top

Crontab ni jedwali la ratiba ambalo daemon ya cron hutumia kuendesha amri: kila mstari una sehemu tano za wakati (dakika, saa, siku ya mwezi, mwezi, siku ya wiki) na amri, kwa mfano */5 * * * * /opt/backup.sh huendesha hati kila dakika 5. Jedwali huhaririwa kwa amri crontab -e, na matatizo mengi yanatokana na mazingira finyu ya cron: tumia njia kamili na elekeza matokeo kwenye kumbukumbu.

Cron ni kipanga-ratiba cha kawaida cha kazi kwenye Linux: daemon cron husoma majedwali ya ratiba (crontab) mara moja kwa dakika na kuendesha amri ambazo wakati wake umefika. Kwa njia hii hufanywa nakala za akiba usiku, kufutwa kwa faili za muda, kusasisha vyeti, na kutuma ripoti. Hapa chini ni sintaksia, mifano ya crontab kwa hali za kawaida, na uchambuzi wa makosa yanayosababisha kazi kutekelezwa "kimya kimya" au isitekelezwe kabisa.

Jinsi ya kufungua na kuhariri crontab

Kila mtumiaji ana jedwali lake. Linashughulikiwa kwa amri crontab, si kwa kuhariri faili moja kwa moja kwenye /var/spool/cron:

AmriInafanya nini
crontab -efungua jedwali lako kwenye kihariri (mara ya kwanza itakuuliza uchague kihariri)
crontab -lonyesha jedwali la sasa
crontab -rfuta jedwali zima bila uthibitisho
crontab -i -rfuta kwa uthibitisho (Debian/Ubuntu, RHEL)
sudo crontab -u alice -ehariri jedwali la mtumiaji mwingine
crontab failibadilisha jedwali kwa yaliyomo ya faili

Baada ya kuhifadhi crontab -e hukagua sintaksia na kuandika crontab: installing new crontab. Ikiwa mstari una kosa, utaona errors in crontab file, can't install na pendekezo la kuhariri tena. Hakuna haja ya kuanzisha upya daemon — mabadiliko yanachukuliwa mara moja.

Kuwa makini na -r: herufi e na r ziko karibu kwenye kibodi, na hakuna nakala ya jedwali. Tabia nzuri ni kuwa na nakala ya akiba:

crontab -l > ~/crontab.bak
# kurejesha
crontab ~/crontab.bak

Sintaksia ya crontab: sehemu tano za wakati

Kila mstari wa kazi unaonekana hivi:

# ┌───────── dakika (0–59)
# │ ┌─────── saa (0–23)
# │ │ ┌───── siku ya mwezi (1–31)
# │ │ │ ┌─── mwezi (1–12 au jan–dec)
# │ │ │ │ ┌─ siku ya wiki (0–7 au sun–sat; 0 na 7 — Jumapili)
# │ │ │ │ │
  * * * * * amri

Katika kila sehemu unaweza kutumia alama maalum:

AlamaMaanaMfano
*thamani yoyote* * * * * — kila dakika
,orodha0 9,18 * * * — saa 9:00 na 18:00
-safu0 9-18 * * * — kila saa kuanzia 9 hadi 18
/hatua*/15 * * * * — kila dakika 15

Hatua inaweza kuunganishwa na safu: 0 8-20/2 * * * — kila saa mbili kuanzia 8 hadi 20 (8, 10, …, 20). Wakati unachukuliwa kwa eneo la saa la mfumo — hakikisha kwa timedatectl.

Mifano ya crontab kwa kila siku

RatibaMstari wa crontab
kila dakika* * * * *
kila dakika 5*/5 * * * *
kila dakika 30*/30 * * * * au 0,30 * * * *
kila saa, mwanzoni mwa saa0 * * * *
kila saa 60 */6 * * *
kila siku saa 3:000 3 * * *
kila siku saa 23:4545 23 * * *
siku za kazi saa 9:000 9 * * 1-5
mwishoni mwa wiki saa sita mchana0 12 * * 6,0
Jumatatu saa 8:3030 8 * * 1
tarehe 1 ya kila mwezi saa 00:000 0 1 * *
kila robo mwaka0 0 1 1,4,7,10 *
mara moja kwa mwaka, 1 Januari0 0 1 1 *
kila dakika 10 wakati wa kazi*/10 9-18 * * 1-5

Mstari kamili wa kazi ni ratiba pamoja na amri:

# nakala ya akiba ya hifadhidata kila usiku saa 3:00
0 3 * * * /usr/local/bin/db-backup.sh >> /var/log/db-backup.log 2>&1

# kusafisha faili za muda zilizo na zaidi ya siku 7 kila Jumapili
0 4 * * 0 /usr/bin/find /tmp/app -type f -mtime +7 -delete

# kukagua tovuti kila dakika 5
*/5 * * * * /usr/bin/curl -fsS https://example.com/health > /dev/null || /usr/local/bin/alert.sh

Viwakilishi maalum: @reboot, @daily na vingine

Badala ya sehemu tano unaweza kuandika kifupi:

KifupiSawa na
@rebootmara moja wakati daemon ya cron inapoanza (baada ya kuwasha mfumo)
@hourly0 * * * *
@daily / @midnight0 0 * * *
@weekly0 0 * * 0
@monthly0 0 1 * *
@yearly / @annually0 0 1 1 *
@reboot /home/alice/bin/start-tunnel.sh >> /home/alice/tunnel.log 2>&1

Kwa huduma zinazopaswa kufanya kazi kila wakati na kuanza upya zinapoanguka, @reboot si suluhisho zuri: ni bora kuandaa unit ya systemd yenye Restart=on-failure.

Jinsi ya kuendesha kazi kila sekunde N

Kitengo kidogo zaidi cha cron ni dakika moja. Ikiwa unahitaji mara nyingi zaidi, kuna njia mbili. Ya kwanza ni mistari kadhaa yenye kucheleweshwa kwa sleep:

* * * * * /opt/check.sh
* * * * * sleep 30; /opt/check.sh

Ya pili, sahihi zaidi, ni kipima muda cha systemd chenye OnUnitActiveSec=30s. Ikiwa kazi inahitaji kuendeshwa zaidi ya mara moja kwa dakika, kwa kawaida hiyo ni kazi ya daemon au kipima muda, si ya cron.

Crontab ya mfumo: /etc/crontab na /etc/cron.d

Mbali na majedwali ya watumiaji, kuna ya mfumo. Muundo wake ni tofauti: kati ya wakati na amri kuna jina la mtumiaji ambaye amri itaendeshwa kwa haki zake.

# /etc/cron.d/certbot-renew
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

0 */12 * * * root certbot renew --quiet

Kilichopo wapi:

  • /etc/crontab — jedwali kuu la mfumo; kwenye Debian/Ubuntu kutoka hapo huendeshwa folda zilizo hapa chini.
  • /etc/cron.d/ — faili tofauti za kazi, ni rahisi kuweka pakiti au kupitia Ansible.
  • /etc/cron.hourly/, cron.daily/, cron.weekly/, cron.monthly/ — hapa huwekwa hati zinazoweza kutekelezwa bila ratiba; huendeshwa na run-parts (au anacron).

Mtego wa run-parts: kwenye Debian na Ubuntu inaruka faili zenye nukta kwenye jina. Hati backup.sh kwenye /etc/cron.daily/ haitaendeshwa — iite backup. Kukagua kile kitakachoendeshwa: run-parts --test /etc/cron.daily.

Faili zilizo kwenye /etc/cron.d/ lazima ziwe za root, zisiwe na ruhusa ya kuandika kwa kundi na kwa wengine, na zimalizike kwa mstari mpya — vinginevyo cron itazipuuza.

Mazingira ya cron: PATH, SHELL na vigezo

Sababu kuu ya msemo "kwenye terminal inafanya kazi, kwenye cron haifanyi" ni mazingira. Cron huendesha amri kupitia /bin/sh, bila .bashrc na .profile yako, na PATH ndogo (kwa kawaida /usr/bin:/bin). Kwa hiyo docker, node au php kutoka /usr/local/bin huenda zisipatikane kabisa.

Vigezo vinaweza kuwekwa mwanzoni mwa jedwali:

SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=admin@example.com
CRON_TZ=Europe/Moscow

0 6 * * * cd /srv/app && ./report.sh
  • MAILTO — matokeo ya kazi yatumwe wapi; MAILTO="" inazima barua pepe.
  • CRON_TZ — eneo la saa kwa ratiba (linaungwa mkono na cronie kwenye RHEL/Fedora; kwenye toleo la cron la Debian kigezo hiki hakifanyi kazi).
  • Hakuna ubadilishaji wa aina ya $HOME/bin ndani ya thamani za vigezo — andika njia kamili.

Chaguo la kuaminika zaidi ni kutaja njia kamili za programu na faili zote kwenye kazi, na kwenye hati weka shebang kama mstari wa kwanza: #!/bin/bash.

Kumbukumbu za cron ziko wapi

Cron huandika kwenye jarida ukweli wa kuanza kwa kazi, lakini si matokeo yake:

# Debian/Ubuntu
grep CRON /var/log/syslog
# kupitia journald ya systemd
journalctl -u cron --since today      # Debian/Ubuntu
journalctl -u crond --since today     # RHEL, Fedora, Rocky
# RHEL bila journald
tail -f /var/log/cron

Mstari wa kuanza unaonekana takriban hivi:

Oct 14 03:00:01 web1 CRON[21544]: (root) CMD (/usr/local/bin/db-backup.sh >> /var/log/db-backup.log 2>&1)

Ili kuona kazi ilichochapisha na kosa lililoifanya ishindwe, elekeza stdout na stderr zote kwenye faili: >> /var/log/job.log 2>&1. Bila hilo, matokeo yanatumwa kwa barua ya ndani, na ikiwa wakala wa barua hajasakinishwa yanapotea (kwenye jarida utaona No MTA installed, discarding output).

Kwa nini cron haiendeshi kazi: makosa ya kawaida

Amri haijapatikana

Dalili: kwenye kumbukumbu ya kazi kuna command not found. Sababu ni PATH finyu. Suluhisho: njia kamili ya programu (which docker itakuonyesha), au mstari wa PATH= mwanzoni mwa jedwali.

Alama ya asilimia kwenye amri

Kwenye crontab ishara % inamaanisha mstari mpya: kila kitu baada ya % ya kwanza kinapelekwa kwenye amri kama ingizo la kawaida. Kwa hiyo mstari wa kawaida wenye tarehe kwenye jina la faili unavunjika:

# si sahihi — amri itakatika kwenye % ya kwanza
0 2 * * * tar czf /backup/site-$(date +%F).tar.gz /var/www
# sahihi — kuikwepa kwa \
0 2 * * * tar czf /backup/site-$(date +\%F).tar.gz /var/www

Rahisi zaidi ni kuweka mantiki kwenye hati, ambako % haihitaji kukwepwa.

Hati haiwezi kutekelezwa au ina mistari ya Windows

Kosa Permission denied linamaanisha faili halina biti x: endesha chmod +x script.sh, au iendeshe waziwazi: /bin/bash /opt/script.sh. Ikiwa hati iliandikwa kwenye Windows, mistari ya CRLF husababisha kosa la ajabu /bin/bash^M: bad interpreter — hurekebishwa kwa sed -i 's/\r$//' script.sh au dos2unix.

Njia za jamaa na folda ya kazi

Kazi huanza kwenye folda ya nyumbani ya mtumiaji. Ikiwa hati inasoma ./config.ini, itatafuta kwenye ~. Tumia cd /srv/app && kabla ya amri, au njia kamili ndani ya hati.

Siku ya mwezi na siku ya wiki kwa pamoja

Ikiwa sehemu zote mbili zimejazwa, cron huendesha kazi wakati chochote kati yao kinapolingana, si wote kwa pamoja. Mstari 0 9 13 * 5 utaendeshwa tarehe 13 na kila Ijumaa, si Ijumaa ya tarehe 13 tu. Sharti sahihi linakaguliwa ndani ya amri:

0 9 13 * * [ "$(date +\%u)" = 5 ] && /opt/friday13.sh

Kazi zinaingiliana

Ikiwa nakala ya akiba inachukua muda mrefu kuliko muda wa kati ya kazi, uendeshaji unaofuata unaanza juu ya uliopita. Ulinzi ni kufuli kwa flock:

*/10 * * * * /usr/bin/flock -n /tmp/sync.lock /opt/sync.sh

Kwa bendera -n nakala ya pili itamaliza mara moja ikiwa ya kwanza bado inafanya kazi.

Daemon ya cron haifanyi kazi

Kagua kwa systemctl status cron (kwenye RHEL — crond). Kwenye picha ndogo, kwa mfano kwenye kontena za Docker, daemon ya cron haipo kabisa — kwa hiyo hakuna wa kutekeleza kazi za crontab huko.

Jinsi ya kurekebisha kazi ya cron

Endesha amri kwenye mazingira yanayofanana kadiri inavyowezekana na cron:

env -i SHELL=/bin/sh PATH=/usr/bin:/bin HOME=$HOME /bin/sh -c '/opt/backup.sh'

Ikiwa hapa kuna kosa, ndilo litakalotokea kwenye cron pia. Kwa muda weka ratiba * * * * *, elekeza matokeo kwenye faili na uyafuatilie kwa tail -f. Kwa kukagua ratiba yenyewe, vikokotoo vya mtandaoni vya misemo ya cron vinasaidia, lakini neno la mwisho ni la kumbukumbu za mfumo.

Nani anaweza kutumia cron: cron.allow na cron.deny

Ufikiaji unadhibitiwa na faili /etc/cron.allow na /etc/cron.deny. Ikiwa cron.allow ipo, crontab inapatikana tu kwa watumiaji walioorodheshwa humo. Ikiwa haipo lakini kuna cron.deny, inapatikana kwa wote isipokuwa walioorodheshwa. Mtumiaji aliyezuiwa akijaribu crontab -e atapata ujumbe You (bob) are not allowed to use this program.

Hitimisho

Crontab ni mistari yenye sehemu tano za wakati na amri: */5 * * * * — kila dakika 5, 0 3 * * * — kila usiku, 0 9 * * 1-5 — siku za kazi. Hariri jedwali kwa crontab -e, tumia njia kamili, kwepa %, andika matokeo kwenye kumbukumbu na linda kazi ndefu kwa flock. Mifano hii ya crontab inatosha kwa kazi nyingi za seva, na otomatiki na upangaji wa kazi umefafanuliwa kwa vitendo katika kozi ya Linux.

Maswali ya mara kwa mara

cron inatofautiana vipi na anacron?

Cron huendesha kazi kwa wakati halisi na huruka kazi ikiwa kompyuta ilikuwa imezimwa. Anacron huhakikisha kwamba kazi za kila siku, kila wiki na kila mwezi zinatekelezwa baada ya kuwasha, kwa hiyo inafaa kwa kompyuta ndogo na za mezani.

Ipi bora: cron au vipima muda vya systemd?

Cron ni rahisi na ipo karibu kila mahali. Vipima muda vya systemd vinatoa kumbukumbu kwenye journalctl, utegemezi, kikomo cha rasilimali, na kigezo cha Persistent=true kwa kazi zilizokosekana, kwa hiyo kwenye seva za kisasa vinachaguliwa mara nyingi zaidi kwa kazi muhimu.

Crontab ya mtumiaji imehifadhiwa wapi?

Kwenye Debian na Ubuntu — kwenye /var/spool/cron/crontabs/jina, na kwenye RHEL na Fedora — kwenye /var/spool/cron/jina. Faili hizi hazipaswi kuhaririwa moja kwa moja; tumia crontab -e.

Ninawezaje kuzima kazi kwenye crontab kwa muda?

Weka alama # mwanzoni mwa mstari kupitia crontab -e. Ili kuzima kazi zote za mtumiaji, hifadhi jedwali kwenye faili kwa crontab -l, kisha lifute kwa crontab -r.

Ninawezaje kuendesha kazi siku ya mwisho ya mwezi?

Hakuna sehemu maalum kwa hilo. Endesha kazi tarehe 28–31 na uthibitishe kwamba kesho ni tarehe 1: 0 23 28-31 * * [ "$(date -d tomorrow +\%d)" = 01 ] && /opt/job.sh.

Jifunze mada hii kwa video

Mada hii inafundishwa kwa kina pamoja na mazoezi katika kozi “Linux: с нуля до уверенного администрирования”.

Nenda kwenye kozi