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
- Inserite l'espressione cron Scrivete i cinque campi — minuto, ora, giorno del mese, mese, giorno della settimana — separati da spazi.
- Rivedete l'OnCalendar= generato Vi viene consegnata la sintassi di systemd corrispondente.
- Leggete gli avvertimenti Là dove giorno del mese e giorno della settimana sono dati insieme, il mutamento di senso vi viene segnalato.
-
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.servicedi 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
anacronper 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
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.