Cron sintaksa je 50% "što piše u prvom redu manuala" i 50% obscure trikova koje uvijek treba googl-at. Ovo je referenc cookbook s najčešćim pattern-ima — kopiraj-paste i ne razmišljaj.
Sintaksa
* * * * * command-to-execute
│ │ │ │ │
│ │ │ │ └─ day of week (0-7, 0 i 7 su nedjelja)
│ │ │ └─── month (1-12)
│ │ └───── day of month (1-31)
│ └─────── hour (0-23)
└───────── minute (0-59)
Najčešći pattern-ovi
Svaku minutu
* * * * *
Pažnja: ovo je puno. 1440 izvršavanja dnevno. Za heavy task → koristi flock.
Svakih 5/15/30 minuta
*/5 * * * * # svakih 5 min
*/15 * * * * # svakih 15 min
*/30 * * * * # svakih 30 min
Svaki sat
0 * * * * # svaki sat na :00
30 * * * * # svaki sat na :30
15 */2 * * * # svakih 2 sata na :15
Specifično vrijeme dnevno
0 3 * * * # svaki dan u 03:00
30 4 * * * # svaki dan u 04:30
0 9,13,17 * * * # svaki dan u 9, 13, 17h
Tjedno
0 4 * * 0 # nedjelja u 04:00
0 2 * * 1 # ponedjeljak u 02:00
0 5 * * 1-5 # radnim danom u 05:00
0 6 * * 6,0 # vikend u 06:00
Mjesečno
0 2 1 * * # prvi u mjesecu u 02:00
0 3 15 * * # 15. u mjesecu u 03:00
0 4 L * * # zadnji dan mjeseca (samo neki cron varijanti)
Godišnje
0 0 1 1 * # 1. siječnja u ponoć
0 0 * 6 * # svaki dan u lipnju u ponoć
Specijalni stringovi
@reboot # pri svakom restart-u servera
@yearly # = 0 0 1 1 *
@monthly # = 0 0 1 * *
@weekly # = 0 0 * * 0
@daily # = 0 0 * * *
@hourly # = 0 * * * *
WordPress crons
Standardni WP cron poziv (zamjena WP-Cron-a)
*/5 * * * * cd /home/USER/public_html && /usr/local/bin/php -q wp-cron.php >/dev/null 2>&1
WP-CLI scheduled task
# Daily cleanup expired transients
0 3 * * * cd /home/USER/public_html && /usr/local/bin/wp transient delete --expired >/dev/null 2>&1
# Hourly stats refresh
0 * * * * cd /home/USER/public_html && /usr/local/bin/wp eval 'do_action("hourly_stats_refresh");' >/dev/null 2>&1
Laravel scheduler
Samo JEDAN cron unos za Laravel:
* * * * * cd /home/USER/app && /usr/local/bin/php artisan schedule:run >> /dev/null 2>&1
Sve task definicije u routes/console.php:
Schedule::command('queue:prune-batches')->hourly();
Schedule::command('reports:daily')->dailyAt('06:00');
Schedule::command('reports:weekly')->weeklyOn(1, '08:00');
Schedule::command('cleanup:logs')->monthlyOn(1, '02:00');
Schedule::command('long:job')->everyFiveMinutes()->withoutOverlapping();
Schedule::command('cache:warm')->timezone('Europe/Zagreb')->at('05:30');
Lock file pattern (sprječavanje overlap-a)
Ako shell skripta može trajat duže od interval-a:
* * * * * /usr/bin/flock -n /tmp/myjob.lock /home/USER/scripts/import.sh
-n = non-blocking. Ako je lock zauzet, skripta se ne pokreće.
Loggat output cron-a
# U fajl
0 3 * * * /script.sh >> /home/USER/logs/cron.log 2>&1
# Samo errori
0 3 * * * /script.sh > /dev/null 2>> /home/USER/logs/cron-error.log
# U syslog
0 3 * * * /script.sh 2>&1 | logger -t myjob
Common gotchi
PATH variable
Cron environment je minimalan. php, wp, node možda neće radit. Rješenje:
# U vrhu crontab-a:
PATH=/usr/local/bin:/usr/bin:/bin
# Ili koristi full path u komandi:
0 3 * * * /usr/local/bin/php /script.php
Working directory
Cron uvijek startuje u home directoriju. Za relativne staze, prefiks s cd:
0 3 * * * cd /home/USER/app && /usr/local/bin/php artisan ...
Time zone
Cron koristi server TZ. Provjeri:
timedatectl # ili 'date'
Ako server u UTC a ti hoćeš 3 ujutro Zagreb time → write cron u UTC equivalent (1:00 UTC ljeti, 2:00 UTC zimi). Ili promijeni server TZ.
Email spam
Default cron pošalje output na MAILTO email (default je vlasnik account-a). Ako ne želiš mail:
# Per-job
0 3 * * * /script.sh > /dev/null 2>&1
# Per-crontab (na vrhu)
MAILTO=""
Debugging — cron ne radi
1. Provjeri da je crontab spremljen
crontab -l # lista trenutni crontab
crontab -e # edit
2. Provjeri sistemski cron log
# RHEL/Alma
grep CRON /var/log/cron
# Ubuntu/Debian
grep CRON /var/log/syslog
3. Test naredbu manualno
Kopiraj cijelu komandu iz crontab-a, pokreni je iz SSH-a. Ako radi tamo ali ne u cron-u → 99% PATH problem.
4. Provjeri permissions
Cron skripta mora biti executable: chmod +x script.sh. Cron user mora imat read pristup do svih fajlova koji se diraju.
5. Provjeri output
Privremeno preusmjeri output u fajl:
0 3 * * * /script.sh > /tmp/cron-debug.log 2>&1
Sutra u 4 ujutro pogledaj /tmp/cron-debug.log.
cPanel cron — specifične napomene
- cPanel ima GUI editor za cron — koristi padajuće menue da izbjegneš syntax error.
- Defaultni MAILTO je email account-a. Ako ne mijenjaš, dobivaš mail za svaki run.
- Shared hosting limit: često 5-min minimum između jobova istog account-a.
- cPanel ne dopušta
@reboot— koristi system cron za to (server admin only).
Korisni alati
- crontab.guru — vizualno objašnjenje bilo kojeg cron expression-a.
- Healthchecks.io / Better Stack Heartbeats — monitoring da cron stvarno radi.
incron— kao cron, ali okida na file system events (touch, modify, delete).systemd timer— moderna alternativa cron-a, ako koristiš systemd-based distro.
WMD i cron support
WMD postavlja standardne cron jobove za sve nove WP/Laravel hosting account-e — wp-cron.php disable + system cron, log rotation, Healthchecks ping za critical jobove. Klijent kroz cPanel može dodavat vlastite cron-ove. Za kompliciranije workflow (queue workers s supervisor, multi-server scheduler) konfiguriramo kroz Super brzu podršku.
FAQ
Smije li cron pokrenut PHP script? Da, uvijek kroz CLI php (npr. /usr/local/bin/php script.php), ne kroz web HTTP request.
Kako pokrenut cron svakih 10 sekundi? Cron ne podržava manju granularnost od 1 minute. Za sub-minute koristi long-running daemon process s sleep 10 loop-om.
Što ako server padne baš u trenutku cron-a? Posao se preskoči — cron ne ima retry. Za critical jobove koristi queue s retry (Laravel Horizon, Sidekiq).
Mogu li imat cron koji se okida na disk-pun event? Ne klasičan cron. Koristi incron ili monitoring agent s alert action.
Cron ne pokreće moj WP plugin task — što sad? Provjeri da WP-Cron nije disabled bez external trigger-a, ili da PHP CLI vidi tvoju WP instalaciju. Test: wp cron event list kroz WP-CLI.
Trebaš pravilan cron setup za sajt ili app? WMD postavlja sve standardne cron-ove + Healthchecks monitoring. Javi se preko kontakt forme.