sistema

Cron di nuova generazione con systemd Creazione di un timer

Cron di nuova generazione con systemd Creazione di un timer
Hai bisogno di programmare qualche attività in futuro sul tuo computer?? Questo può sembrare semplice - dopo tutto, la tua lavastoviglie è in grado di aspettare prima di avviarsi con l'aiuto di un pulsante - ma a volte i computer eseguono compiti così semplici così difficile.Ma se hai qualche background, probabilmente ne avrai sentito parlare cron, questo software completamente dedicato a lanciare l'attività giusta al momento giusto. Ma questo strumento è stato davvero progettato pensando alla semplicità e alla fine potresti avere brutte sorprese.Se sei mai riuscito a pianificare un'attività su Windows, hai utilizzato l'Utilità di pianificazione di Windows. Ha una GUI per impostazione predefinita, ma non lo rende anche così semplice da usare: questi due sistemi avviano semplicemente un processo a un'ora e una data fisse.

Per capire come systemd può esserti utile lì, farò un esempio.

Quali insidie ​​ti eviteranno i timer di sistema?

Se possiedi una macchina con dati che ti interessano, vorrai avere una copia dei tuoi dati in un altro posto, probabilmente più sicuro. Se gestisci un server, è obbligatorio: dopotutto, come farai a recuperare se il tuo disco rigido si guasta e ti impedirà di recuperare qualsiasi dato?

Quindi, come persona responsabile, imposti il ​​backup ogni settimana o ogni giorno. Puoi configurarlo usando cron, lo pianifichi alle 4:24 AM, ma qui inizia il problema: cosa succede se il tuo server viene spento dalle 4:10 AM alle 4:30 AM per qualsiasi motivo?

Beh, è ​​probabile che cron salti quel backup. Questo potrebbe essere fondamentale se ciò accade spesso e in silenzio o se il tuo codice si basa sul fatto che viene eseguito e potrebbe non riuscire altrimenti. Generalmente questo accade quando si imposta un'attività di pulizia tramite cron e non si avvia. Improvvisamente il tuo codice potrebbe non avere spazio sufficiente per continuare e si romperà - è triste, così triste situazione, giusto Mr Elton John.

Tuttavia, se un lancio mancato può essere un problema, immagina un secondo - wow, John Lennon adesso? - che il tuo compito è troppo lento. Se la tua attività è impostata per l'esecuzione ogni 10 minuti ma richiede 15 minuti per essere completata, cron o Windows avvieranno felicemente un'altra attività anche se l'attività corrente non è ancora stata completata, quindi avrai 2 istanze della tua attività in esecuzione contemporaneamente , qual è ricetta perfetta per disastro. Quando un programma è in esecuzione contemporaneamente mentre non è progettato per farlo, molto probabilmente corromperà file, altri software, database - e il tuo server diventa improvvisamente una nave che affonda come il Titanic.

OK, forse sto andando troppo oltre con Titanic ma hai reso l'idea. Anche se systemd non avrebbe potuto fare molto per salvare questa nave, può aiutarti con tutte queste carenze e assicurarti una vacanza di Natale più lunga grazie ai bug che ti eviterà. È ora di imparare a impostare i timer di sistema.

Come pianificare il backup automatico del server?

Prima di tutto, i timer systemd attivano un servizio systemd, quindi prima di pianificare l'attività, dovrai prima renderla un servizio. Fortunatamente, ho scritto una guida per creare un servizio systemd, in questo modo ti introdurrà al modo di lavorare di systemd. Dovresti leggerlo prima di andare avanti. A meno che tu non Esattamente sapere cosa stai facendo, il tuo file di servizio systemd dovrebbe non contenere qualsiasi impostazione WantedBy=. Se desideri avviare il servizio in un momento specifico, probabilmente non vorrai avviarlo all'avvio.

Grazie al sistema di servizio systemd, è impossibile avere più istanze della tua attività in esecuzione per errore: se un'attività è già in esecuzione, salterà semplicemente quell'avvio e lascerà che l'attività attualmente in esecuzione finisca il suo lavoro.

Una volta che hai un servizio systemd da pianificare, crea un file con lo stesso nome file del tuo servizio tranne che dovrebbe terminare con .timer invece di .servizio. Nel nostro esempio di backup automatico, il servizio sarebbe backup automatico.servizio e il timer sarebbe backup automatico.Timer. Entrambi i file dovrebbero trovarsi nella stessa directory. Come ti ho detto nell'articolo del servizio systemd, ti consiglio di scrivere questi file in un posto normale come la tua home directory e poi, copiarli in una cartella systemd, una volta terminate le modifiche.

Quindi, lascia che ti mostri come appare il nostro file timer:

[Unità]
Description=Pianifica backup durante le ore non di punta
[Timer]
OnCalendario=*-*-* 03:00:00
RandomizedDelaySec=7200
Persistente=vero
[Installare]
WantedBy=timer.bersaglio

Proprio come nei servizi systemd, ci sono 3 sezioni. [Unità] o [Installa] funzionano esattamente come spiegato nel mio articolo sui servizi di sistema. Nota che WantedBy= è importante qui perché i timer possono essere avviati o fermati, quindi se non dici a systemd di avviare il timer durante l'avvio, non si attiverà mai. timer.target è un target systemd speciale per i timer.

Ora, la sezione [Timer]. Al suo interno, troverai tutte le impostazioni relative a quando il timer dovrebbe attivarsi. Per il nostro backup automatico, ho detto a systemd di eseguirlo tra le 3:00 e le 5:00 del fuso orario del server. L'ora esatta è casuale ogni giorno.

OnCalendar= imposta il timer relativo all'ora del tuo server (orologio a muro), ad esempio ogni domenica alle 13:00. Se hai usato cron in precedenza, dovresti avere molta familiarità con questa sintassi. Tuttavia ha alcuni vantaggi aggiuntivi.

Ad esempio, se vuoi che accada qualcosa ogni ora, puoi fare così:

OnCalendar=ogni ora

e tutti i giorni:

OnCalendar=giornaliero

Infatti, supporta tutti i seguenti valori:

  1. minuziosamente
  2. ogni ora
  3. quotidiano
  4. mensile
  5. settimanalmente
  6. annuale
  7. trimestrale
  8. semestrale

C'è però un problema con queste parole chiave: ad esempio, ogni giorno attiva sempre la mezzanotte, che è spesso un'ora di punta nei sistemi informatici. Ecco perché si consiglia di utilizzare RandomizedDelaySec= (il suo utilizzo è specificato di seguito). Comunque per il backup non è una buona opzione: la mezzanotte non è fuori dalle ore di punta, è piuttosto il contrario. Quindi dobbiamo impostare in modo più accurato quando vogliamo vedere l'attività avviata.

Se vuoi un maggiore controllo, puoi scrivere una data come 2018-12-06 12:49:37. Bene, se sei così specifico, attiverai il timer una volta sola. Per renderlo ricorrente, sostituirai uno di questi elementi con * asterisco.

OnCalendario=*-*-* 03:00:00

Come puoi vedere sopra, nel nostro esempio di backup, tutta la parte della data è *-*-*, il che significa che dovrebbe verificarsi ogni giorno di ogni mese di ogni anno. Ora se lo fai:

OnCalendario=*-12-25 03:00:00

Quindi viene eseguito ogni 25 dicembre alle 3 del mattino. Timer di sistema perfetto per Babbo Natale - anche se dubito che ne avrà mai bisogno! Quindi l'asterisco aggiunge ricorrenza dove lo metti. Se lo metti nel campo anno, significa "ogni anno", ecc.

Infine, puoi aggiungere l'UTC alla fine della riga per utilizzare l'ora UTC invece del fuso orario locale local. Ad esempio, alcuni servizi reimpostano le loro quote API a mezzanotte, ma per evitare qualsiasi distorsione del fuso orario utilizza UTC. Quindi per tali compiti, faresti:

OnCalendar=UTC giornaliero

Ora risolviamo un altro problema: le ore di punta. systemd ha anche un'impostazione per combatterlo.

RandomizedDelaySec= consente di ritardare l'attività di un periodo di tempo casuale. Il valore è il numero massimo di secondi che il timer ritarderà. È destinato specificamente a questi casi. Ti ricordi che in systemd, ogni giorno si attiva sempre a mezzanotte? Bene, i trigger settimanali si attivano sempre a mezzanotte di lunedì e i trigger annuali a mezzanotte del 1 gennaio, uno dei peggiori picchi dell'anno con interruzioni di rete ovunque. Certamente non vuoi che ciò accada.

Aggiungendo un ritardo, rimuovi quel problema: ritarderà automaticamente in un momento sconosciuto il tuo compito. La casualità qui è importante perché è molto più probabile che sia anche quando è casuale e un carico uniforme consente di ottimizzare meglio le tue attività.

Supponiamo che tu debba eseguire le tue attività intorno alle 7:00 per la mattina ma vuoi consentire un piccolo ritardo di massimo 15 minuti, faresti in questo modo:

RandomizedDelaySec=900

Questo dovrebbe essere sufficiente per i ritardi. A volte anche millisecondi di ritardo sono sufficienti per prevenire picchi involontari.

Persistente= si occupa dei trigger del timer mancati. Cosa succede se il tuo server è spento durante la notte?? Bene, il backup non si attiverebbe mai. Impostarlo su true consente a systemd di eseguirlo all'avvio successivo in questi casi. In questo modo sai in un modo o nell'altro, l'attività del timer verrà eseguita. Il suo utilizzo è semplice, basta fare questo:

Persistente=vero

Questo ha tuttavia uno svantaggio che è davvero difficile da evitare comunque: quando vengono perse più attività da timer diversi, verranno eseguite tutte all'avvio e rallenteranno l'avvio. Secondo me è molto meglio che se non funziona mai e dopotutto è normale, il momento più appropriato per far funzionare il timer è quando è programmato, dopodiché sarà comunque inappropriato.

OnBootSec= è l'ultima opzione che ti mostrerò (ma non meno importante). È se vuoi attivare un timer qualche tempo dopo l'avvio invece che in base al calendario. Ad esempio, se è necessario verificare all'avvio se il server è avviato correttamente e funziona come previsto, è possibile scrivere un servizio di controllo e utilizzare l'impostazione del timer per attivarlo dopo che il sistema ha avuto abbastanza tempo per l'avvio.

Diciamo che il sistema ha bisogno di 3 minuti per avviarsi, potresti fare:

OnBootSec=180

E nonostante il nome, puoi anche fare:

OnBootSec=3 minuti

Se precisi sia OnBootSec= che OnCalendar=, avvierà il servizio ogni volta che si verifica uno di questi 2 eventi.

Ok, ora è il momento di salvare il file, copiarlo nella cartella di sistema se hai seguito i miei consigli sopra e verificare se il timer funziona correttamente.

Abilita il tuo nuovo timer e monitoraggio

Per testare il tuo nuovo timer, devi dire a systemd che hai aggiunto un nuovo timer, quindi devi digitare questo comando:

$ sudo systemctl daemon-reload

Ora, systemd terrà conto del tuo nuovo timer e osserverà da vicino quando eseguire la tua attività. Poiché systemd è sempre in esecuzione, dopotutto è uno dei migliori candidati per gestire ed eseguire le attività pianificate.

Tuttavia, una cosa che potresti trovare controintuitiva: un timer è disabilitato per impostazione predefinita. Per abilitarlo, devi eseguire questo comando:

$ sudo systemctl enable --now automatic-backup.Timer

Probabilmente vorrai vedere se il tuo timer funziona come previsto. Buone notizie: systemd è anche così gentile da avere un comando che ti dice quando è stato lanciato l'ultima volta e quando è programmato il prossimo avvio (tranne se il timer è impostato per essere eseguito solo all'avvio, poiché systemd non sa quando il sistema si riavvierà, ovviamente). Ecco quel comando:

$ systemctl stato backup automatico.Timer

Infine, quando non hai più bisogno del timer, puoi disabilitarlo anche:

$ sudo systemctl disable --now automatizzato-backup.Timer

Conclusione

Usando i timer di sistema, la tua gestione delle attività pianificate è a un livello successivo: onestamente, personalmente ritengo che le attività pianificate avrebbero dovuto essere così da anni.

Oh, una piccola sorpresa per te: tutti i timer di sistema sono registrati in un sistema ben strutturato con filtri, rotazione dei registri e simili. Quindi ti invito a vedere come puoi vedere i registri sulle tue attività pianificate!

I migliori giochi da riga di comando per Linux
La riga di comando non è solo il tuo più grande alleato quando usi Linux, ma può anche essere una fonte di intrattenimento perché puoi usarla per gioc...
Le migliori app di mappatura del gamepad per Linux
Se ti piace giocare su Linux con un gamepad invece di un tipico sistema di input di tastiera e mouse, ci sono alcune app utili per te. Molti giochi pe...
Strumenti utili per i giocatori Linux
Se ti piace giocare su Linux, è probabile che tu abbia utilizzato app e utilità come Wine, Lutris e OBS Studio per migliorare l'esperienza di gioco. O...