Sintassi di OnCalendar
Il formato è [GiornoSettimana] Data Ora, con ogni parte opzionale: Mon..Fri *-*-* 06:30:00. I giorni della settimana usano nomi di tre lettere con intervalli .. e virgole. La data è YYYY-MM-DD con * per «qualsiasi»; l’ora è HH:MM:SS (i secondi sono 00 di default). Ogni campo accetta liste (1,15), intervalli (8..18) e passi (*/15 o 0/15, 8..18/2). Scorciatoie: minutely, hourly, daily, weekly, monthly, yearly, quarterly. Un nome di fuso in coda applica l’espressione in quel fuso (*-*-* 09:00 Europe/Rome).
| Cron | OnCalendar |
|---|---|
| */5 * * * * | *-*-* *:*/5:00 |
| 0 * * * * | hourly |
| 30 6 * * 1-5 | Mon..Fri *-*-* 06:30:00 |
| 0 9 1 * * | *-*-01 09:00:00 |
| 0 3 * * 0 | Sun *-*-* 03:00:00 |
| 0 0 L * * | *-*~01 00:00:00 (ultimo giorno del mese: ~ conta dalla fine) |
Cosa fanno i timer che cron non fa
- Persistent=true: se la macchina era spenta quando il timer doveva scattare, eseguilo al prossimo avvio. Cron semplicemente lo perde (anacron esiste per questo).
- RandomizedDelaySec=: distribuisce le esecuzioni in una finestra così che un parco macchine non colpisca il server nello stesso secondo.
- AccuracySec=: un minuto di default; imposta
1sse l’ora esatta conta, o un valore maggiore per raggruppare i risvegli e risparmiare energia. - I log vanno nel journal (
journalctl -u nome.service), il job gira con il sandboxing, le dipendenze e i limiti di risorse del service, esystemctl list-timersmostra la prossima e l’ultima esecuzione.
Verificare un’espressione
systemd-analyze calendar "Mon..Fri *-*-* 06:30" stampa la forma normalizzata e la prossima scadenza, che è ciò che questa pagina riproduce. Dopo aver installato un timer: systemctl daemon-reload && systemctl enable --now nome.timer, poi systemctl list-timers --all.
Domande
Perché il mio timer gira una volta e mai più?
Di solito il timer è stato avviato ma non abilitato (systemctl enable --now nome.timer), oppure il service che attiva è un oneshot senza una unit timer corrispondente. Controlla systemctl list-timers e journalctl -u nome.timer.
Come eseguo un timer come utente normale?
Metti le unit in ~/.config/systemd/user/, usa systemctl --user, ed esegui loginctl enable-linger $USER perché scattino senza una sessione di login attiva.
OnCalendar usa il fuso orario di sistema?
Sì, a meno che l’espressione non termini con un nome di fuso, supportato da systemd 243+. Le immagini container e cloud di solito sono in UTC; imposta il fuso esplicitamente se la pianificazione è intesa in ora locale.
Come esprimo «ogni giorno feriale alle 9 e alle 17»?
Mon..Fri *-*-* 09,17:00:00. Le liste funzionano in qualsiasi campo.