bitlvl
IT

Spiegazione di OnCalendar dei timer systemd

Scrivi un’espressione OnCalendar o incolla una riga cron da convertire. Ottieni il significato, le prossime dieci esecuzioni e una coppia completa .timer + .service da mettere in /etc/systemd/system.

File delle unit

  

I risultati e i messaggi di questo strumento sono mostrati in inglese.

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).

CronOnCalendar
*/5 * * * **-*-* *:*/5:00
0 * * * *hourly
30 6 * * 1-5Mon..Fri *-*-* 06:30:00
0 9 1 * **-*-01 09:00:00
0 3 * * 0Sun *-*-* 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 1s se 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, e systemctl list-timers mostra 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.