Blog

Izvršavanje automatskih zadataka na Linuxu uz Cron

Filip Štetić

Rijetko tko od nas ima vremena i volje u dva ujutro pokretati skripte za stvaranje sigurnosne kopije sustava, a još manje stalno provjeravati je li server podignut. Sva sreća pa za takve probleme Linux sustavi nude Cron servis za automatizaciju periodičnih zadataka. Ime mu potječe iz starogrčke riječi chronos[1] koja znači vrijeme. Zadaci koji se pokreću pomoću Crona nazivaju se Cronjob-ovi, a njih se definira u tablici crontab.

Datoteke Crona

Datoteke koje sadrže definicije zadataka za pojedinačnog korisnika nalaze se u /var/spool/cron direktoriju, a zadaci definirani od strane sustava i aplikacija nalaze se u /etc/cron.d direktoriju. Osim navedenog, postoji još i /etc/anacrontab o kojem će više biti rečeno kasnije u tekstu.

Naredba crontab –e najčešći je i najlakši način dodavanja Cronjob-ova. Zastavica –e znači edit. Ta naredba otvorit će korisnikovu Crontab datoteku koristeći standardno sučelje za obradu teksta (Nano, Vi, Vim, Emacs, …). Također će, nakon zatvaranja sučelja, ponovno pokrenuti servis kako bi se novi zadatak odmah učitao.

Cron datoteke ne sadrže nikakvo okruženje, odnosno nemaju definirane bilo kakve okolišne varijable, zbog čega se one definiraju unutar cron datoteke.

Najbitnije su varijable SHELL, MAILTO i PATH.

  • SHELL varijabla govori sustavu koje sučelje za izvršavanje naredbi koristiti. Najpopularniji su bash, sh, ksh. Navode se punom putanjom do binarne datoteke, npr. /bin/bash.
  • MAILTO varijabla sadrži e-mail adresu na koju cron šalje informacije o zadataku. Zadani način izvještavanja korisnika je putem e-maila. To so može promijeniti preusmjeravanjem na standardni izlaz koristeći naredbe zadanog sučelja. U slučaju basha to bi bilo „>“ za standardni izlaz, „2>“ za izlaz za pogreške i „2>&1“ nakon „>“ za oba izlaza.
  • PATH varijabla govori koje putanje treba pretraživati kod izvođenja zadataka. Primjerice ako se izvršava skripta entrypoint.sh, putanja do direktorija gdje se ona nalazi mora bit u varijabli PATH ili mora biti definirana cijela putanja do nje.

Sintaksa naredbi

Sintaksa za definiranje vremena izvođenja specifična je i na prvu komplicirana, no uz par pokušaja i online alate poput Crontab Gurua lagano je uhodati se i naučiti ju. Neki korisnici vole imati podsjetnik unutar Cron datoteke koji može izgledati ovako:

* * * * * naredba
| | | | |_______ day (week) (0-6 where 0 is Sunday or SUN-SUT)
| | | |_________ month (1-12 or JAN-DEC)
| | |__________ day (month) (1-31)
| |____________ hour (0-23)
|_____________ minute (0-59)

Na primjer:

5 4 31 12 * echo Hello Cron! > output.txt 

Ova linija definira zadatak koji će u 4 sata i 5 minuta, 31. prosinca ispisati „Hello Cron!“ u datoteku output.txt.

Postoji mnoštvo opcija za definiranje specifičnih vremena.

Znak zvjezdice (*) predstavlja bilo koju vrijednost.
Znak zareza (,) koristi se za nabrajanje vrijednosti, npr. 0 1,3,5 * * * znači u 01:00, 03:00 i 05:00 svakog dana.
Znak crtice () definira raspon vrijednosti, npr. 0 0 * * 1-5 znači svakim radnim danom u 00:00.
Kosa crta (/) služi za definiranje koraka, npr. 0 */2 * * 1 znači svaki ponedjeljak svaki drugi sat (00:00, 02:00, 04:00, …). Također se može definirati i raspon koji ulazi u formulu, 8-16/3 znači svaki treći sat u vremenima između 8 sati i 16 sati (8, 11, 14).

Cron također dopušta specijalne opcije za lakše definiranje koristeći @options format:

  • @hourly – svaki sat u 0 minuta
  • @daily – svaki dan u ponoć
  • @weekly – svaki tjedan u nedjelju u ponoć
  • @monthly – svaki prvi dan u mjesecu u ponoć
  • @yearly – 1.1. u ponoć svake godine
  • @reboot – kod svakog pokretanja sustava

Skripte

Prethodno je spomenuto izvođenje skripti uz Cron. Često trebamo izvršavati poveće zadatke koji ne stanu u jednu naredbu. U tom slučaju moramo definirati SHELL ili u naredbu staviti kojim sučeljem izvršavamo skriptu i napraviti skriptu izvršnom. Na Linuxu se to radi naredbom chmod +x skripta i u Cron datoteku stavi se samo:

SHELL=/bin/bash
* * * * * skripta

ili

* * * * * /bin/bash skripta

Primjer

Primjer kako mi koristimo Cron u našem projektu SOVA o kojem možete više pročitati u našem blogu:

SHELL=/bin/bash
00 * * * * ~/entrypoint.sh > ~/cronlog 2>&1

Gdje entrypoint.sh sadrži dvije naredbe:

source utils.SOVA/env/bin/activate    # activate virtual environment
python utils.SOVA/sync_feedback/main.py    # run python script

Ono što Cronjob radi je da svaki sat izvršavamo sinkronizaciju servera gdje prebacujemo slike s jednog na drugi.

Anacron

Jedna od mana Crona je što u slučaju da zadatak nije izvršen, on se neće ponoviti. Upravo iz tog razloga postoji još jedan servis, Anacron. Anacron radi isto što i Cron, no u slučaju da je sustav bio ugašen ili je postojao neki drugi problem, za razliku od Crona, ponovno izvršava preskočene zadatke.

Naime on čita zadatke iz konfiguracijske datoteke /etc/anacrontab. Takva datoteka sadrži listu zadataka koji specificiraju period izvršavanja u danima, odgodu u minutama, jedinstveni identifikator i naredbu.

Za korištenje anacrona samo treba dodati svoj cronfile, unutar nekog od direktorija /etc/cron.[hourly|daily|weekly|monthly], ovisno o intervalu izvođenja.

Dodatne informacije

Detaljnije upute korištenja i objašnjenja mogu se naći pomoću linux man (manual) naredbe.

man 8 cron
man 5 crontab
man 8 anacron
man 5 anacrontab


[1] Stari Grci imali su dvije riječi za vrijeme: chronos i kairos. Chronos predstavlja kvantitativno, mjerljivo vrijeme, vrijeme koje vidimo na satovima, dok kairos predstavlja trenutke mira i spokoja u kojem imamo osjećaj da je vrijeme stalo, na primjer smijanje s prijateljima ili gledanje lijepog zalaska.