Crontab: mifano ya ratiba ya kazi kwenye Linux, sintaksia na makosa ya kawaida
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:
| Amri | Inafanya nini |
|---|---|
crontab -e | fungua jedwali lako kwenye kihariri (mara ya kwanza itakuuliza uchague kihariri) |
crontab -l | onyesha jedwali la sasa |
crontab -r | futa jedwali zima bila uthibitisho |
crontab -i -r | futa kwa uthibitisho (Debian/Ubuntu, RHEL) |
sudo crontab -u alice -e | hariri jedwali la mtumiaji mwingine |
crontab faili | badilisha 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:
| Alama | Maana | Mfano |
|---|---|---|
* | thamani yoyote | * * * * * — kila dakika |
, | orodha | 0 9,18 * * * — saa 9:00 na 18:00 |
- | safu | 0 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
| Ratiba | Mstari wa crontab |
|---|---|
| kila dakika | * * * * * |
| kila dakika 5 | */5 * * * * |
| kila dakika 30 | */30 * * * * au 0,30 * * * * |
| kila saa, mwanzoni mwa saa | 0 * * * * |
| kila saa 6 | 0 */6 * * * |
| kila siku saa 3:00 | 0 3 * * * |
| kila siku saa 23:45 | 45 23 * * * |
| siku za kazi saa 9:00 | 0 9 * * 1-5 |
| mwishoni mwa wiki saa sita mchana | 0 12 * * 6,0 |
| Jumatatu saa 8:30 | 30 8 * * 1 |
| tarehe 1 ya kila mwezi saa 00:00 | 0 0 1 * * |
| kila robo mwaka | 0 0 1 1,4,7,10 * |
| mara moja kwa mwaka, 1 Januari | 0 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:
| Kifupi | Sawa na |
|---|---|
@reboot | mara moja wakati daemon ya cron inapoanza (baada ya kuwasha mfumo) |
@hourly | 0 * * * * |
@daily / @midnight | 0 0 * * * |
@weekly | 0 0 * * 0 |
@monthly | 0 0 1 * * |
@yearly / @annually | 0 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 narun-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/binndani 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.
Mada hii inafundishwa kwa kina pamoja na mazoezi katika kozi “Linux: с нуля до уверенного администрирования”.
Nenda kwenye kozi