Conversione da espressione cron a temporizzatore systemd

Strumento gratuito che converte un'espressione cron — minuti, ore, giorno, mese e giorno della settimana — nella sintassi OnCalendar dei temporizzatori di systemd. Avverte quando l'indicazione congiunta di giorno e giorno della settimana produce una condizione di disgiunzione ed è comodo nelle migrazioni da cron negli ambienti a contenitori.

Corrispondenza fra i campi cron e i componenti di systemd

I cinque campi di un'espressione cron corrispondono così agli elementi della sintassi OnCalendar di systemd.

Posizione Campo cron Elemento corrispondente in systemd
1 Minuti I minuti della parte oraria (MM in HH:MM:SS)
2 Ore Le ore della parte oraria (HH in HH:MM:SS)
3 Giorno del mese Il giorno della parte di data (il giorno in anno-mese-giorno)
4 Mese Il mese della parte di data (il mese in anno-mese-giorno)
5 Giorno della settimana Il prefisso del giorno della settimana (per esempio Mon oppure Mon..Fri)

Poiché cron non ha un campo per i secondi, in systemd essi valgono sempre «00». Inoltre, se tanto la data quanto il giorno della settimana restano illimitati con l'asterisco, la parte anno-mese-giorno di systemd si può omettere.

Corrispondenza fra i numeri dei giorni in cron e le sigle di systemd

Cron rappresenta il giorno della settimana con un numero da 0 a 7, mentre systemd usa le sigle inglesi.

Numero del giorno in cron Sigla del giorno in systemd
0 (7) Sun
1 Mon
2 Tue
3 Wed
4 Thu
5 Fri
6 Sat

Esempi di conversione più comuni

Espressione cron OnCalendar= Significato
* * * * *
OnCalendar=*-*-* *:*:00
Viene eseguito ogni minuto, come l'espressione cron «* * * * *».
*/15 * * * *
OnCalendar=*:00/15:00
Viene eseguito ogni quindici minuti.
0 9 * * 1-5
OnCalendar=Mon..Fri 09:00:00
Viene eseguito alle nove nei giorni feriali, dal lunedì al venerdì.
0 0 1 * *
OnCalendar=*-*-01 00:00:00
Viene eseguito il primo giorno di ogni mese a mezzanotte.
0 0 1 1 *
OnCalendar=*-01-01 00:00:00
Viene eseguito il primo gennaio di ogni anno a mezzanotte.
0 0 1 * 1
OnCalendar=Mon 00:00:00
OnCalendar=*-*-01 00:00:00
Esempio con l'indicazione congiunta del giorno del mese, il primo, e del giorno della settimana, il lunedì. In cron vale la disgiunzione: l'esecuzione avviene quando è soddisfatta anche una sola condizione. Un'unica riga come Mon *-*-01 sarebbe una congiunzione (il primo del mese che cade di lunedì) e scatterebbe solo da una a tre volte l'anno, perciò il risultato usa due righe per mantenere lo stesso significato.

Le espressioni cron che limitano sia il giorno del mese sia il giorno della settimana (nessuno dei due inizia con l'asterisco) cambiano significato se scritte in un'unica riga OnCalendar=, perché cron applica la disgiunzione e systemd, all'interno di una riga, la congiunzione. Scrivendo due righe nella stessa unità .timer, una per il giorno della settimana e una per la data, l'esecuzione avviene nei giorni che soddisfano l'una o l'altra, proprio come in cron.

Riscrivere un'espressione cron come timer di systemd

Portare una pianificazione da cron a un timer di systemd comporta tradurre i cinque campi — minuto, ora, giorno del mese, mese e giorno della settimana — nella sintassi OnCalendar=. Inserite un'espressione cron e questo strumento produce il corrispondente OnCalendar=, insieme ad avvertimenti su quanto meriti attenzione.

Il punto capitale di questa traduzione sta nel comportamento del giorno del mese e del giorno della settimana quando entrambi sono dati. Cron li legge come un oppure: 0 0 1 * 1 significa «il primo del mese oppure ogni lunedì» e può scattare una cinquina di volte al mese. L'OnCalendar= di systemd, invece, tratta la medesima indicazione come una congiunzione. Viene a significare «il primo e che sia lunedì», e scatta appena da una a tre volte l'anno. Una traduzione meccanica muta dunque la frequenza con cui il lavoro gira, e lo fa in silenzio. Questo strumento coglie quella combinazione e la divide in due righe OnCalendar= per conservarne il significato.

Come convertire

  1. Inserite l'espressione cron Scrivete i cinque campi — minuto, ora, giorno del mese, mese, giorno della settimana — separati da spazi.
  2. Rivedete l'OnCalendar= generato Vi viene consegnata la sintassi di systemd corrispondente.
  3. Leggete gli avvertimenti Là dove giorno del mese e giorno della settimana sono dati insieme, il mutamento di senso vi viene segnalato.
  4. Trascrivetelo in un'unità timer Incollatelo nella sezione [Timer] di un file .timer.

Consigli per sfruttarlo al meglio

  • Limitando sia il giorno del mese sia il giorno della settimana, cron applica la disgiunzione. Poiché systemd, all'interno di una riga, applica la congiunzione, lo strumento produce due righe OnCalendar=: un temporizzatore con più righe scatta quando ne è soddisfatta una qualsiasi.
  • Le immagini a contenitore minimali, come le immagini Docker ufficiali di Debian e Ubuntu, spesso non comprendono il demone cron (Alpine Linux include il crond di BusyBox, che però va avviato a mano). Se l'host usa systemd, passare il lavoro a un temporizzatore di systemd è una valida alternativa.
  • La riga OnCalendar generata si può verificare anche passandola al comando «systemd-analyze calendar», che ne controlla la sintassi e mostra la prossima esecuzione prevista.
  • A differenza della singola riga di una tabella di pianificazione, un temporizzatore systemd si compone di due file: l'unità .timer e l'unità .service che contiene l'elaborazione vera e propria.
  • La sintassi di ripetizione di systemd (es. 00/15) non ha un valore finale, quindi un passo limitato come il 10-20/5 di cron viene espanso in un elenco come 10,15,20. Anche un passo sul giorno della settimana (*/2) non si può scrivere Sun/2 in systemd, e viene quindi espanso in Sun,Tue,Thu,Sat.

Quando torna utile

Nel passare a un ambiente a contenitori

I contenitori spesso non recano alcun demone cron, sicché le pianificazioni devono passare a timer di systemd o ad altro assetto.

Nel volere una traccia di ciò che è girato

Un timer di systemd lascia la propria traccia in journald, che si può seguire in seguito.

Nel volere dipendenze fra lavori

Girare solo dopo che un'altra unità sia partita è cosa che cron non sa esprimere.

Nel fare l'inventario delle pianificazioni esistenti

Convertire in blocco una serie di espressioni cron vi dà l'occasione di accertare che gli intervalli siano quelli voluti.

Termini dei pianificatori

Espressione cron
La sintassi che esprime un'ora con cinque campi: minuto, ora, giorno del mese, mese e giorno della settimana. Giorno del mese e giorno della settimana si leggono come un oppure.
OnCalendar=
La chiave che indica l'ora in un timer di systemd. Giorno del mese e giorno della settimana vi si leggono come una congiunzione.
Unità timer
Un file con estensione .timer, che avvia il .service di pari nome.
Persistent=
L'impostazione che fa recuperare un timer dopo l'avvio se il sistema era spento all'ora prevista. Agisce all'incirca come anacron per cron.
AccuracySec=
La tolleranza sull'ora di scatto. Per impostazione vale un minuto di gioco, perciò la si indica dove l'ora debba essere esatta.
Journald
La raccolta dei registri di systemd. Anche l'uscita di un lavoro avviato da un timer vi si conserva.

Domande frequenti

Si indica nella forma «giorno della settimana anno-mese-giorno ore:minuti:secondi», con i primi due elementi facoltativi. L'asterisco significa «senza limiti», cioè tutti i valori; i due punti in successione indicano un intervallo, la barra un passo e la virgola un elenco. Per esempio «Mon..Fri 09:00:00» significa le nove in punto nei giorni feriali.

I temporizzatori offrono funzioni che cron da solo non ha: la gestione unificata dei registri di esecuzione tramite il diario di sistema, l'attesa dell'avvio dei servizi da cui si dipende, la ripetizione automatica in caso di errore. Inoltre, negli ambienti a contenitori le immagini di base tendono sempre più a escludere il demone cron per restare leggere, e sugli ospiti basati su systemd il passaggio ai temporizzatori diventa la naturale alternativa.

La specifica di Vixie cron prevede che, quando entrambi sono limitati a valori diversi dall'asterisco, valga la disgiunzione: basta che una sola condizione sia soddisfatta. Nella sintassi OnCalendar di systemd, invece, giorno della settimana e data sono sempre in congiunzione e devono coincidere entrambi. Rilevando questo caso, lo strumento produce due righe OnCalendar=, una per il giorno della settimana e una per la data, così da mantenere il significato di cron. Un campo del giorno che inizia con l'asterisco, come */2, è considerato non limitato da cron e si combina con il giorno della settimana in congiunzione, perciò resta in una sola riga.

Nella maggior parte dei casi il risultato si può usare così com'è, ma prima di metterlo in esercizio si raccomanda di elencare le prossime esecuzioni con systemd-analyze calendar e di verificare che coincidano con quanto voleva l'espressione cron originaria. Rivedete anche le impostazioni che cron non ha, come Persistent=, che recupera le esecuzioni perse mentre il sistema era spento.

L'espressione cron standard a cinque campi non comprende i secondi, perciò nella riga OnCalendar prodotta da questo strumento la parte dei secondi vale sempre «00». La sintassi OnCalendar in sé ammette anche l'indicazione dei secondi, ma la conversione da cron non se ne serve.
Tool-kun

A proposito — da cron ai temporizzatori di systemd

Comparso intorno al 2010 come sistema di inizializzazione che governa l'avvio di Linux, systemd è diventato lo standard di molte distribuzioni. I suoi temporizzatori offrono, come cron, un meccanismo di esecuzione periodica, ma dispongono di funzioni che cron non aveva: la risoluzione delle dipendenze, la gestione unificata dei registri di esecuzione nel diario di sistema, la ripetizione in caso di insuccesso.

Negli ambienti a contenitori, d'altra parte, si moltiplicano le immagini di base che escludono deliberatamente il demone cron per contenere le dimensioni. Per eseguire lavori periodici in tali ambienti, la scelta realistica è affidarsi al meccanismo dell'orchestratore, come i lavori pianificati di Kubernetes, oppure, se l'ospite si fonda su systemd, ai suoi temporizzatori.

La sintassi OnCalendar è più espressiva dei cinque campi di cron e ammette indicazioni annuali e precisione al secondo, ma proprio per questa differenza alcune espressioni cron — quelle che limitano insieme giorno del mese e giorno della settimana in disgiunzione — cambiano significato con una conversione ingenua. Lo strumento avverte esplicitamente di questo punto per far scoprire per tempo un'insidia difficile da notare durante una migrazione.