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 *-*-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, cioè l'esecuzione avviene quando è soddisfatta anche una sola condizione, mentre in systemd vale la congiunzione, cioè soltanto nei giorni che le soddisfano entrambe: attenzione, perché la conversione risulta meno frequente dell'espressione originaria.

Le espressioni cron che limitano a valori diversi dall'asterisco tanto il giorno del mese quanto il giorno della settimana non si convertono fedelmente nella sintassi OnCalendar, perché cron applica la disgiunzione e systemd la congiunzione. In questi casi valutate di suddividere il lavoro in due temporizzatori distinti.

Consigli

  • Indicando a valori diversi dall'asterisco tanto il giorno del mese quanto il giorno della settimana, la disgiunzione di cron non è esprimibile fedelmente con la congiunzione di systemd. Leggete allora l'avviso nel risultato e, se occorre, suddividete il lavoro in due temporizzatori.
  • Alcune immagini a contenitore minimali, come quelle basate su Alpine Linux, non comprendono affatto il demone cron: il passaggio ai temporizzatori di systemd diventa allora 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.
  • Per le pianificazioni semplici, che non usano insieme giorno del mese e giorno della settimana — ogni ora, ogni giorno, ogni settimana — la conversione corrisponde sempre esattamente.

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 mostra un avviso e segnala che il risultato può risultare più restrittivo, cioè meno frequente, dell'espressione originaria.

Per le pianificazioni semplici, che non usano insieme giorno del mese e giorno della settimana, la conversione è esatta. Se però compare l'avviso sulla disgiunzione, la periodicità può differire da quella voluta: prima di mettere in esercizio si raccomanda di verificare la prossima esecuzione con il comando «systemd-analyze calendar».

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.