Gabay

Crontab: mga halimbawa ng iskedyul ng gawain sa Linux, syntax at karaniwang pagkakamali

Na-update: · Skillaria.Top

Ang crontab ay talaan ng iskedyul na sinusunod ng cron daemon sa pagpapatakbo ng mga command: bawat linya ay may limang field ng oras (minuto, oras, araw ng buwan, buwan, araw ng linggo) at ang command, halimbawa ang */5 * * * * /opt/backup.sh ay nagpapatakbo ng script tuwing 5 minuto. Ina-edit ang talaan gamit ang crontab -e, at karamihan ng problema ay galing sa pinaikling environment ng cron: gumamit ng buong path at i-redirect ang output sa log.

Ang cron ang standard na scheduler ng gawain sa Linux: binabasa ng daemon na cron ang mga talaan ng iskedyul (crontab) kada minuto at pinapatakbo ang mga command na dumating na ang oras. Ganito ginagawa ang backup tuwing gabi, paglilinis ng mga pansamantalang file, pag-renew ng certificate, at pagpapadala ng ulat. Sa ibaba ang syntax, mga crontab halimbawa para sa karaniwang kaso, at ang pagsusuri ng mga pagkakamaling dahilan kung bakit "tahimik" na hindi tumatakbo ang gawain.

Paano buksan at i-edit ang crontab

Sariling talaan ang bawat user. Ginagamit ito sa pamamagitan ng command na crontab, hindi sa direktang pag-edit ng mga file sa /var/spool/cron:

CommandAno ang ginagawa
crontab -ebuksan ang sarili mong talaan sa editor (sa unang pagtakbo, magtatanong kung aling editor ang gagamitin)
crontab -lipakita ang kasalukuyang talaan
crontab -rburahin nang buo ang talaan, walang kumpirmasyon
crontab -i -rburahin na may kumpirmasyon (Debian/Ubuntu, RHEL)
sudo crontab -u alice -ei-edit ang talaan ng ibang user
crontab filepalitan ang talaan ng nilalaman ng file

Pagkatapos i-save ang crontab -e, sinusuri nito ang syntax at nagsasabing crontab: installing new crontab. Kapag may mali sa linya, makikita ang errors in crontab file, can't install at aalok itong i-edit muli. Hindi kailangang i-restart ang daemon — awtomatikong kinukuha ang mga pagbabago.

Mag-ingat sa -r: magkatabi ang mga letrang e at r sa keyboard, at walang backup ng talaan. Magandang ugali ang laging may kopya:

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

Syntax ng crontab: limang field ng oras

Ganito ang bawat linya ng gawain:

# ┌───────── minuto (0–59)
# │ ┌─────── oras (0–23)
# │ │ ┌───── araw ng buwan (1–31)
# │ │ │ ┌─── buwan (1–12 o jan–dec)
# │ │ │ │ ┌─ araw ng linggo (0–7 o sun–sat; 0 at 7 — Linggo)
# │ │ │ │ │
  * * * * * command

Sa bawat field, puwedeng gamitin ang mga espesyal na simbolo:

SimboloKahuluganHalimbawa
*anumang halaga* * * * * — bawat minuto
,listahan0 9,18 * * * — sa 9:00 at 18:00
-saklaw0 9-18 * * * — bawat oras mula 9 hanggang 18
/hakbang*/15 * * * * — bawat 15 minuto

Puwedeng pagsamahin ang hakbang at saklaw: 0 8-20/2 * * * — bawat dalawang oras mula 8 hanggang 20 (8, 10, …, 20). Ang oras ay kinukuha ayon sa timezone ng system — suriin ito gamit ang timedatectl.

Crontab halimbawa para sa araw-araw na gawain

IskedyulLinya ng crontab
bawat minuto* * * * *
bawat 5 minuto*/5 * * * *
bawat 30 minuto*/30 * * * * o 0,30 * * * *
bawat simula ng oras0 * * * *
bawat 6 na oras0 */6 * * *
araw-araw sa 3:000 3 * * *
araw-araw sa 23:4545 23 * * *
weekday sa 9:000 9 * * 1-5
weekend sa tanghali0 12 * * 6,0
tuwing Lunes sa 8:3030 8 * * 1
ika-1 ng bawat buwan sa 00:000 0 1 * *
kada quarter0 0 1 1,4,7,10 *
taun-taon, Enero 10 0 1 1 *
bawat 10 minuto sa oras ng trabaho*/10 9-18 * * 1-5

Kumpletong linya ng gawain — iskedyul kasama ang command:

# backup ng database tuwing gabi sa 3:00
0 3 * * * /usr/local/bin/db-backup.sh >> /var/log/db-backup.log 2>&1

# paglilinis ng mga pansamantalang file na mas matanda sa 7 araw tuwing Linggo
0 4 * * 0 /usr/bin/find /tmp/app -type f -mtime +7 -delete

# suriin ang site tuwing 5 minuto
*/5 * * * * /usr/bin/curl -fsS https://example.com/health > /dev/null || /usr/local/bin/alert.sh

Mga espesyal na string: @reboot, @daily at iba pa

Sa halip na limang field, puwedeng isulat ang maikling alias:

AliasKatumbas
@rebootisang beses kapag nagsimula ang cron daemon (pagkatapos ng boot)
@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

Para sa mga serbisyong dapat laging tumatakbo at mag-restart kapag bumagsak, mahina ang @reboot bilang solusyon: mas mainam gumawa ng systemd unit na may Restart=on-failure.

Paano patakbuhin ang gawain bawat N segundo

Ang pinakamaliit na yunit ng cron ay isang minuto. Kung kailangan ng mas madalas, may dalawang paraan. Ang una ay ilang linya na may pagkakaiba ng oras gamit ang sleep:

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

Ang pangalawa, na mas tama, ay systemd timer na may OnUnitActiveSec=30s. Kung mas madalas sa isang minuto ang gawain, kadalasan ay trabaho na ito para sa daemon o timer, hindi para sa cron.

System crontab: /etc/crontab at /etc/cron.d

Bukod sa mga talaan ng user, may mga system na talaan. Iba ang format nila: sa pagitan ng oras at ng command ay may pangalan ng user kung saan papatakbuhin ang command.

# /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

Kung saan nakalagay ang mga ito:

  • /etc/crontab — ang pangunahing system na talaan; sa Debian/Ubuntu, mula rito pinapatakbo ang mga direktoryong nasa ibaba.
  • /etc/cron.d/ — hiwalay na file ng mga gawain, maginhawa para ilagay ng mga package o sa pamamagitan ng Ansible.
  • /etc/cron.hourly/, cron.daily/, cron.weekly/, cron.monthly/ — dito inilalagay ang mga executable na script na walang iskedyul; pinapatakbo sila ng run-parts (o anacron).

Isang bitag sa run-parts: sa Debian at Ubuntu, nilalaktawan nito ang mga file na may tuldok sa pangalan. Hindi tatakbo ang script na backup.sh sa /etc/cron.daily/ — pangalanan itong backup. Para tingnan kung ano ang tatakbo, gamitin ang run-parts --test /etc/cron.daily.

Ang mga file sa /etc/cron.d/ ay dapat pag-aari ng root, hindi writable ng grupo at ng iba, at nagtatapos sa line break — kung hindi, babalewalain ng cron ang mga ito.

Environment ng cron: PATH, SHELL at mga variable

Ang pangunahing dahilan ng pariralang "gumagana sa terminal pero hindi sa cron" ay ang environment. Pinapatakbo ng cron ang mga command gamit ang /bin/sh, nang walang iyong .bashrc at .profile, at may minimal na PATH (kadalasan /usr/bin:/bin). Kaya maaaring hindi makita ang docker, node o php na nasa /usr/local/bin.

Maaaring itakda ang mga variable sa simula ng talaan:

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 — kung saan ipapadala ang output ng gawain; ang MAILTO="" ay pumipigil sa pagpapadala ng email.
  • CRON_TZ — timezone para sa iskedyul (suportado ng cronie sa RHEL/Fedora; sa bersyon ng cron ng Debian, hindi gumagana ang variable na ito).
  • Walang substitution gaya ng $HOME/bin sa mga halaga ng variable — isulat nang buo ang mga path.

Ang pinakamaaasahang paraan ay gumamit ng absolute path para sa lahat ng program at file sa gawain, at sa mga script, ilagay sa unang linya ang shebang: #!/bin/bash.

Saan titingnan ang mga log ng cron

Itinatala ng cron sa journal ang mismong pagtakbo ng gawain, pero hindi ang output nito:

# Debian/Ubuntu
grep CRON /var/log/syslog
# sa pamamagitan ng systemd-journald
journalctl -u cron --since today      # Debian/Ubuntu
journalctl -u crond --since today     # RHEL, Fedora, Rocky
# RHEL na walang journald
tail -f /var/log/cron

Ganito ang hitsura ng linya ng pagtakbo:

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

Para makita kung ano ang na-print ng gawain at anong error ang nangyari, i-redirect ang stdout at stderr sa file: >> /var/log/job.log 2>&1. Kung wala nito, ipapadala ang output sa pamamagitan ng lokal na mail, at kung walang naka-install na mail agent, mawawala ito (lalabas sa journal ang No MTA installed, discarding output).

Bakit hindi tumatakbo ang gawain sa cron: mga karaniwang pagkakamali

Hindi makita ang command

Sintomas: sa log ng gawain ay command not found. Dahilan: maliit na PATH. Solusyon: buong path sa programa (ituturo ng which docker ang path nito), o linyang PATH= sa simula ng talaan.

Porsiyento sa loob ng command

Sa crontab, nangangahulugang line break ang simbolong %: lahat ng nasa likod ng unang % ay ipinapasa sa command bilang standard input. Kaya nasisira ang klasikong linya na may petsa sa pangalan ng file:

# mali — puputulin ang command sa unang %
0 2 * * * tar czf /backup/site-$(date +%F).tar.gz /var/www
# tama — i-escape
0 2 * * * tar czf /backup/site-$(date +\%F).tar.gz /var/www

Mas simple pa: ilagay ang lohika sa script, kung saan hindi na kailangang i-escape ang %.

Hindi executable ang script o mali ang line ending

Ang error na Permission denied ay nangangahulugang walang bit na x ang file: patakbuhin ang chmod +x script.sh o tawagin nang tahasan, /bin/bash /opt/script.sh. Kung isinulat ang script sa Windows, nagdudulot ang CRLF line ending ng kakaibang error na /bin/bash^M: bad interpreter — ayusin ito gamit ang sed -i 's/\r$//' script.sh o dos2unix.

Relatibong path at working directory

Nagsisimula ang gawain sa home directory ng user. Kung binabasa ng script ang ./config.ini, hahanapin niya ito sa ~. Gumamit ng cd /srv/app && bago ang command, o absolute path sa loob ng script.

Araw ng buwan at araw ng linggo nang sabay

Kapag may nakalagay sa parehong field, tumatakbo ang cron kapag tumugma ang alinman sa dalawa, hindi ang pareho. Ang linyang 0 9 13 * 5 ay tatakbo sa ika-13 ng buwan at tuwing Biyernes, hindi lamang sa Biyernes ika-13. Ang tamang kondisyon ay sinusuri sa loob ng command:

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

Nagsasabay-sabay ang mga gawain

Kapag mas matagal ang backup kaysa sa agwat ng iskedyul, sisimulan ng susunod na takbo ang bago habang tumatakbo pa ang nauna. Proteksyon ang lock gamit ang flock:

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

Sa flag na -n, agad magtatapos ang pangalawang instance kung tumatakbo pa ang una.

Hindi tumatakbo ang cron daemon

Suriin gamit ang systemctl status cron (sa RHEL, crond). Sa mga minimal na image, halimbawa sa Docker container, walang cron daemon — kaya walang magpapatakbo ng mga gawain sa crontab doon.

Paano i-debug ang gawain sa cron

Patakbuhin ang command sa environment na malapit sa cron:

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

Kung may error dito, ganoon din ang mangyayari sa cron. Pansamantalang ilagay ang iskedyul na * * * * *, i-redirect ang output sa file, at sundan ito gamit ang tail -f. Para sa pagsusuri ng mismong iskedyul, may mga online calculator ng expression ng cron, pero ang huling salita ay nasa log ng system.

Sino ang puwedeng gumamit ng cron: cron.allow at cron.deny

Nilimitahan ang access ng mga file na /etc/cron.allow at /etc/cron.deny. Kung umiiral ang cron.allow, tanging ang mga user na nakalista rito ang may crontab. Kung wala ito pero may cron.deny, lahat maliban sa mga nakalista ang may access. Ang user na nasa listahan ng bawal ay makakatanggap ng mensaheng You (bob) are not allowed to use this program sa crontab -e.

Buod

Ang crontab ay mga linya ng limang field ng oras at command: */5 * * * * — bawat 5 minuto, 0 3 * * * — bawat gabi, 0 9 * * 1-5 — tuwing weekday. I-edit ang talaan gamit ang crontab -e, gumamit ng absolute path, i-escape ang %, isulat ang output sa log, at protektahan ang mahahabang gawain gamit ang flock. Sapat na ang mga crontab halimbawa rito para sa karamihan ng gawain sa server, at ang automation at pag-iiskedyul ng gawain ay ipinapaliwanag din nang praktikal sa kursong Linux.

Mga madalas itanong

Ano ang pagkakaiba ng cron at anacron?

Pinapatakbo ng cron ang mga gawain sa eksaktong oras at nilalaktawan ang mga ito kung naka-off ang computer. Tinitiyak ng anacron na matatapos ang mga araw-araw, lingguhan, at buwanang gawain pagkatapos ng pag-on, kaya angkop ito para sa laptop at desktop.

Alin ang mas mainam: cron o systemd timer?

Mas simple ang cron at halos nasa lahat ng system. Ang systemd timer ay may log sa journalctl, mga dependency, limitasyon sa resources, at parameter na Persistent=true para sa mga nalaktawang pagtakbo, kaya mas madalas na itong pinipili sa mga modernong server para sa mahahalagang gawain.

Saan physically nakaimbak ang crontab ng user?

Sa Debian at Ubuntu, nasa /var/spool/cron/crontabs/pangalan; sa RHEL at Fedora, nasa /var/spool/cron/pangalan. Huwag direktang i-edit ang mga file na ito, gamitin ang crontab -e.

Paano pansamantalang i-disable ang isang gawain sa crontab?

I-comment out ang linya gamit ang # sa simula nito sa pamamagitan ng crontab -e. Para i-disable ang lahat ng gawain ng user, i-save muna ang talaan sa file gamit ang crontab -l, at saka burahin ito gamit ang crontab -r.

Paano patakbuhin ang gawain sa huling araw ng buwan?

Walang hiwalay na field para dito. Patakbuhin ang gawain sa ika-28 hanggang ika-31 at suriin kung bukas ang unang araw ng buwan: 0 23 28-31 * * [ "$(date -d tomorrow +\%d)" = 01 ] && /opt/job.sh.

Pag-aralan ito sa video

Detalyadong tinatalakay ang paksang ito, may praktis, sa kursong “Linux: с нуля до уверенного администрирования”.

Pumunta sa kurso