Sintaksa crontab in načrtovana opravila v Linuxu

Linux Branje: 3 min

Cron job je načrtovano opravilo, ki ga storitev cron v Linuxu samodejno zažene ob določenih časih, na primer za izdelavo varnostne kopije, zagon vzdrževalne skripte ali načrtovana opravila spletne aplikacije. Seznam opravil se imenuje crontab.

Urejanje crontab

Načrtovana opravila svojega uporabnika urejaš z naslednjim ukazom:

crontab -e

Seznam že nastavljenih opravil:

crontab -l

Kot uporabnik root lahko urejaš tudi crontab drugega uporabnika: crontab -u felhasznalo -e. Pazi na ukaz crontab -r: brez vprašanja izbriše vsa tvoja opravila (r je na tipkovnici ob e). V AlmaLinux 10 je bila v preizkusu varnostna kopija izbrisanega crontab shranjena v datoteko ~/.cache/crontab/crontab.bak, od koder jo obnoviš z ukazom crontab ~/.cache/crontab/crontab.bak; v drugih sistemih takšna kopija morda ne nastane. Če uporabljaš gostovanje cPanel, lahko opravila dodaš tudi v vmesniku, glej: Ustvarjanje opravila cron v cPanelu.

Sintaksa crontab

Vsaka vrstica je sestavljena iz petih časovnih polj in ukaza, ki ga je treba zagnati:

* * * * * ukaz
│ │ │ │ │
│ │ │ │ └── dan v tednu (0–7, tako 0 kot 7 sta nedelja)
│ │ │ └──── mesec (1–12)
│ │ └────── dan v mesecu (1–31)
│ └──────── ura (0–23)
└────────── minuta (0–59)

V poljih lahko uporabiš naslednje oznake:

  • *: vse vrednosti;
  • ,: naštevanje, na primer 1,15 (1. in 15. dan v mesecu);
  • -: obseg, na primer 1-5 (od ponedeljka do petka);
  • /: korak, na primer */15 (vsakih 15 minut).

Praktični primeri

  • 0 3 * * *: vsak dan ob 3. uri zjutraj
  • */15 * * * *: vsakih 15 minut
  • 0 0 1 * *: prvi dan vsakega meseca ob polnoči
  • 0 9 * * 1: vsak ponedeljek ob 9. uri
  • 30 8-18 * * 1-5: ob delavnikih med 8. in 18. uro, ob 30. minuti vsake ure

Celoten vnos:

0 3 * * * /usr/bin/php /home/felhasznalo/mentes.php >> /home/felhasznalo/mentes.log 2>&1

Ta vsak dan ob 3. uri zjutraj zažene skripto PHP in njen izpis skupaj s sporočili o napakah zapiše na konec dnevniške datoteke.

Namesto petih polj lahko uporabiš tudi okrajšave: @reboot (ob zagonu sistema), @hourly, @daily, @weekly, @monthly.

Sistemski crontab

Poleg uporabniškega crontab na lastnem strežniku opravila vsebujeta tudi datoteka /etc/crontab in imenik /etc/cron.d/. V njih je za časovnimi polji še šesto polje: uporabnik, v imenu katerega teče ukaz, na primer 0 4 * * * root /usr/local/bin/takaritas.sh.

Če se opravilo cron ne izvede

Najpogostejši vzrok je, da ukaz ročno deluje, iz crona pa ne. Vzroki za to:

  • Poti: cron teče z minimalnim okoljem, PATH vsebuje le nekaj imenikov (v AlmaLinux 10 v preizkusu /usr/bin:/bin:/usr/sbin:/sbin, torej /usr/local/bin in lastnega imenika ~/bin ni v njem). Vedno navedi celotno pot (/usr/bin/php, ne php). Natančno mesto pokaže ukaz which php.
  • Znak %: v crontab % pomeni prelom vrstice, zato ga je treba na primer v ukazu date +%F zapisati kot \%. V preizkusu je cron iz vrstice date +%F > /tmp/kimenet.txt zagnal le del date + (v dnevniku: CMDEND (date +)), datoteka sploh ni nastala; v obliki date +\%F se je izvedel pravilno.
  • Dovoljenja: skripta mora biti izvršljiva (chmod +x szkript.sh), glej članek o dovoljenjih datotek.
  • Časovni pas: cron teče po časovnem pasu strežnika. Preveri ga z ukazom timedatectl.

Zagone beleži sistemski dnevnik: v AlmaLinux in Rocky Linux jih najdeš v datoteki /var/log/cron, v Debianu in Ubuntuju z ukazom journalctl -u cron oziroma, če je nameščen rsyslog, v datoteki /var/log/syslog. Izpis opravila je dobro preusmeriti v datoteko, kot kaže zgornji primer, tako lahko ob napaki ugotoviš, kaj se je zgodilo.

Pri straneh WordPress je bolje namesto vgrajenega WP-Cron uporabiti pravo opravilo cron, o tem preberi v našem članku o zamenjavi crona WordPress.

Nazaj: Linux – članki (76)