A cron job olyan ütemezett feladat, amelyet a Linux cron szolgáltatása automatikusan, meghatározott időpontokban futtat le, például egy biztonsági mentés elkészítéséhez, egy karbantartó szkript futtatásához vagy egy webalkalmazás időzített feladataihoz. A feladatok listáját crontabnak nevezik.
A crontab szerkesztése
A saját felhasználójához tartozó ütemezett feladatokat a következő paranccsal szerkesztheti:
crontab -e
A már beállított feladatok listázása:
crontab -l
root felhasználóként egy másik felhasználó crontabja is szerkeszthető: crontab -u felhasznalo -e. Vigyázzon a crontab -r paranccsal: kérdés nélkül törli az összes feladatát (az r a billentyűzeten az e mellett van). AlmaLinux 10-en a teszten a törölt crontab mentése a ~/.cache/crontab/crontab.bak fájlba került, ahonnan a crontab ~/.cache/crontab/crontab.bak paranccsal visszaállítható; más rendszereken ilyen mentés nem biztos, hogy készül. Ha cPanel tárhelyet használ, a feladatokat a felületen is felveheti, lásd: Cron job létrehozása cPanelben.
A crontab szintaxisa
Minden sor öt időmezőből és a futtatandó parancsból áll:
* * * * * parancs
│ │ │ │ │
│ │ │ │ └── hét napja (0–7, a 0 és a 7 is vasárnap)
│ │ │ └──── hónap (1–12)
│ │ └────── hónap napja (1–31)
│ └──────── óra (0–23)
└────────── perc (0–59)
A mezőkben az alábbi jelölések használhatók:
*: minden érték;,: felsorolás, például1,15(a hónap 1. és 15. napján);-: tartomány, például1-5(hétfőtől péntekig);/: lépésköz, például*/15(15 percenként).
Gyakorlati példák
0 3 * * *: minden nap hajnali 3 órakor*/15 * * * *: 15 percenként0 0 1 * *: minden hónap első napján, éjfélkor0 9 * * 1: minden hétfőn 9 órakor30 8-18 * * 1-5: munkanapokon 8 és 18 óra között, minden óra 30. percében
Egy teljes bejegyzés:
0 3 * * * /usr/bin/php /home/felhasznalo/mentes.php >> /home/felhasznalo/mentes.log 2>&1
Ez minden nap hajnali 3-kor lefuttatja a PHP-szkriptet, és a kimenetét a hibaüzenetekkel együtt a naplófájl végére írja.
Az öt mező helyett rövidítések is használhatók: @reboot (a rendszer indulásakor), @hourly, @daily, @weekly, @monthly.
A rendszerszintű crontab
A felhasználói crontab mellett saját szerveren a /etc/crontab fájl és a /etc/cron.d/ könyvtár is tartalmaz feladatokat. Ezekben az időmezők után egy hatodik mező is szerepel: a felhasználó, akinek a nevében a parancs fut, például 0 4 * * * root /usr/local/bin/takaritas.sh.
Ha a cron job nem fut le
A leggyakoribb ok, hogy a parancs kézzel működik, cronból viszont nem. Ennek okai:
- Elérési utak: a cron minimális környezettel fut, a
PATHcsak néhány könyvtárat tartalmaz (AlmaLinux 10-en a teszten/usr/bin:/bin:/usr/sbin:/sbin, tehát a/usr/local/binés a saját~/binkönyvtár nincs benne). Mindig a teljes útvonalat adja meg (/usr/bin/php, nemphp). A pontos helyet awhich phpparancs mutatja meg. - A
%jel: a crontabban a%sortörést jelent, ezért például egydate +%Fparancsban\%formában kell írni. A teszten adate +%F > /tmp/kimenet.txtsorból a cron csak adate +részt futtatta (a naplóban:CMDEND (date +)), a fájl létre sem jött;date +\%Fformában rendben lefutott. - Jogosultság: a szkriptnek futtathatónak kell lennie (
chmod +x szkript.sh), lásd a fájljogosultságokról szóló cikket. - Időzóna: a cron a szerver időzónája szerint fut. Ellenőrizze a
timedatectlparanccsal.
A futásokat a rendszernapló rögzíti: AlmaLinux és Rocky Linux alatt a /var/log/cron fájlban, Debian és Ubuntu alatt a journalctl -u cron paranccsal, illetve ha az rsyslog telepítve van, a /var/log/syslog fájlban találja. A feladat kimenetét érdemes fájlba irányítani, ahogy a fenti példa mutatja, így hiba esetén visszakereshető, mi történt.
WordPress oldalak esetén érdemes a beépített WP-Cron helyett valódi cron jobot használni, erről a WordPress cron cseréjéről szóló cikkünkben olvashat.