Cron contro timer systemd
| cron | timer systemd | |
|---|---|---|
| Definizione | Una riga in un crontab | Due file: .timer (quando) e .service (cosa) |
| Esecuzioni mancate | Perse (salvo anacron) | Persistent=true le esegue al prossimo avvio |
| Ambiente | PATH minimale, nessun profilo; output spedito via mail | Definito nella unit; output nel journal |
| Sovrapposizione | Riparte anche se l’esecuzione precedente è ancora in corso | Mai: un timer aspetta che il suo service finisca |
| Dipendenze | Nessuna | After=network-online.target, mount, altre unit |
| Limiti di risorse, sandboxing | No | Tutti quelli di systemd: MemoryMax, CPUQuota, ProtectSystem… |
| Ispezione | crontab -l, grep nel syslog | systemctl list-timers, journalctl -u, systemctl status |
| Semplicità | Una riga | Venti righe |
Per una riga singola su una macchina personale, cron va bene. Per qualsiasi cosa su un server che non deve sovrapporsi, deve recuperare dopo un fermo, ha bisogno di limiti, o i cui log qualcuno leggerà in seguito, un timer è lo strumento migliore, e il convertitore scrive il boilerplate.
Cosa fa il convertitore con il comando
ExecStart= richiede un percorso assoluto e argomenti, non una riga di shell. Le redirezioni (>> log 2>&1) vengono eliminate perché il journal cattura l’output; pipe e && vengono racchiusi in /bin/sh -c '…'. La regola di cron per cui % significa a capo non si applica, quindi date +%F funziona così com’è. Le variabili d’ambiente impostate nel crontab vanno in righe Environment=.
Giorno del mese e giorno della settimana
Se una riga cron limita entrambi, cron scatta quando uno dei due corrisponde; systemd richiede entrambi. Il convertitore avvisa, perché quella pianificazione richiede due timer per essere riprodotta.
Domande
Dove vanno i file?
/etc/systemd/system/ per le unit di sistema, ~/.config/systemd/user/ per le unit utente (poi usa systemctl --user e loginctl enable-linger). Esegui systemctl daemon-reload dopo aver aggiunto o modificato.
Come vedo quando girerà la prossima volta?
systemctl list-timers --all mostra la prossima e l’ultima esecuzione di ogni timer. systemd-analyze calendar "espr" mostra la prossima scadenza di qualsiasi espressione OnCalendar.
Come lo eseguo adesso, senza aspettare?
systemctl start nome.service (non il timer). Il timer mantiene la propria pianificazione.
Un timer può girare ogni 10 secondi?
Sì, con OnCalendar=*:*:0/10 e AccuracySec=1s, oppure con OnUnitActiveSec=10s per «10 secondi dopo la fine dell’ultima esecuzione». Cron non può scendere sotto il minuto.