Entrambi eseguono qualcosa a orario. La differenza si vede quando un lavoro fallisce, quando dura a lungo, o quando la macchina era spenta proprio nel momento in cui era previsto.

Cron e le sue due trappole

crontab -e
# m h dom mon dow  command
15 3 * * *  /usr/bin/php /var/www/site/cron.php >> /var/log/site-cron.log 2>&1
  • L'ambiente è quasi vuoto. PATH è ridotto all'osso e il profilo della tua shell non viene letto, perciò un comando che funziona quando lo digiti qui fallisce. Usa percorsi assoluti.
  • L'output è posta, non un log. Senza la redirezione qui sopra finisce in una casella locale che nessuno legge, e il lavoro sembra essere girato in silenzio.

Se un lavoro cron sembra non partire mai del tutto, l'elenco in I cron che non partono mai copre il resto.

Un timer, e che cosa aggiunge

# /etc/systemd/system/site-cron.service
[Unit]
Description=Site maintenance

[Service]
Type=oneshot
User=www-data
WorkingDirectory=/var/www/site
ExecStart=/usr/bin/php cron.php
# /etc/systemd/system/site-cron.timer
[Unit]
Description=Run site maintenance nightly

[Timer]
OnCalendar=*-*-* 03:15:00
Persistent=true
RandomizedDelaySec=300

[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now site-cron.timer
systemctl list-timers --all
journalctl -u site-cron -n 50

Che cosa ti dà il timer

  • I log nel journal, con il codice di uscita, per ogni esecuzione.
  • Nessun accavallamento — un'esecuzione ancora in corso quando scatta la successiva non ne avvia una seconda copia.
  • Persistent=true — un'esecuzione saltata mentre la macchina era spenta avviene al riavvio successivo.
  • RandomizedDelaySec — una flotta di server non colpisce tutta insieme la stessa API alle 03:15:00 esatte.

Quale usare

Un lavoro da una riga su una macchina sola: cron, e non pensarci troppo. Tutto ciò di cui devi vedere lo storico, tutto ciò che non deve girare due volte e tutto ciò che conta se viene saltato: un timer.

Non programmare lo stesso lavoro in entrambi. È un esito frequente di una migrazione lasciata a metà, e raddoppia ogni esecuzione — comprese quelle che mandano posta o addebitano carte.