Introduzione
Una delle sfide (tra i tanti vantaggi) dell'essere un amministratore di sistema è eseguire attività quando preferisci dormire. Ad esempio, alcune attività (comprese le attività ricorrenti regolarmente) devono essere eseguite durante la notte o nei fine settimana, quando nessuno si aspettava di utilizzare le risorse del computer. Non ho tempo da perdere la sera per eseguire comandi e script che devono funzionare durante le ore di riposo. E non voglio dovermi alzare a oh-dark-hundred per avviare un backup o un aggiornamento importante.
Al contrario, utilizzo due utilità di servizio che mi consentono di eseguire comandi, programmi e attività a orari predeterminati. Il cron e a i servizi consentono agli amministratori di sistema di pianificare le attività da eseguire in un momento specifico in futuro. Il servizio at specifica un'attività una tantum che viene eseguita in un determinato momento. Il servizio cron può pianificare attività su base ripetitiva, ad esempio giornaliera, settimanale o mensile.
1. Cron
Il cron è un'utilità software, offerta da un sistema operativo simile a Linux che automatizza l'attività pianificata a un'ora predeterminata. È un processo daemon , che viene eseguito come processo in background ed esegue le operazioni specificate all'ora predefinita in cui viene attivato un determinato evento o condizione senza l'intervento di un utente. Gestire frequentemente un'attività ripetuta è un'attività intimidatoria per l'amministratore di sistema e quindi può pianificare l'esecuzione automatica di tali processi in background a intervalli di tempo regolari creando un elenco di quei comandi utilizzando cron .
Consente agli utenti di eseguire l'attività pianificata su base regolare in modo discreto, come eseguire il backup ogni giorno a mezzanotte, pianificare gli aggiornamenti su base settimanale, sincronizzare i file a intervalli regolari. Cron verifica il lavoro pianificato in modo ricorrente e quando i campi dell'ora pianificata corrispondono ai campi dell'ora corrente, i comandi pianificati vengono eseguiti. Viene avviato automaticamente da /etc/init.d all'ingresso di livelli di esecuzione multiutente.
Usi comuni (e non comuni) di cron
Uso il cron servizio per programmare cose ovvie, come backup regolari che si verificano ogni giorno alle 2 del mattino. Lo uso anche per cose meno ovvie.
- Gli orari di sistema (ovvero l'ora del sistema operativo) sui miei numerosi computer vengono impostati utilizzando il Network Time Protocol (NTP). Mentre NTP imposta l'ora di sistema, non imposta l'ora hardware, che può variare. Uso cron per impostare l'ora dell'hardware in base all'ora del sistema.
- Ho anche un programma Bash che eseguo ogni mattina presto che crea un nuovo "messaggio del giorno" (MOTD) su ogni computer. Contiene informazioni, come l'utilizzo del disco, che dovrebbero essere aggiornate per essere utili.
- Molti processi e servizi di sistema, come Logwatch, logrotate e Rootkit Hunter, utilizzano il servizio cron per pianificare attività ed eseguire programmi ogni giorno.
Il crond daemon è il servizio in background che abilita la funzionalità cron.
Il servizio cron verifica la presenza di file in /var/spool/cron e /etc/cron.d directory e /etc/anacrontab file. Il contenuto di questi file definisce i lavori cron che devono essere eseguiti a vari intervalli. I singoli file cron utente si trovano in /var/spool/cron e i servizi e le applicazioni di sistema generalmente aggiungono file di lavoro cron in /etc/cron.d directory. Il /etc/anacrontab è un caso speciale che verrà trattato più avanti in questo articolo.
Come usare cron in Linux
Non c'è tempo per i comandi? La pianificazione delle attività con cron significa che i programmi possono essere eseguiti ma non devi rimanere alzato fino a tardi.
Utilizzo di crontab
L'utilità cron viene eseguita in base ai comandi specificati in una tabella cron (crontab ). Ogni utente, incluso root, può avere un file cron. Questi file non esistono per impostazione predefinita, ma possono essere creati in /var/spool/cron directory utilizzando crontab -e comando che viene utilizzato anche per modificare un file cron (vedi lo script di seguito). Ti consiglio vivamente di non usa un editor standard (come Vi, Vim, Emacs, Nano o uno qualsiasi dei tanti altri editor disponibili).
Crontab
Utilizzando il crontab command non solo ti consente di modificare il comando, ma riavvia anche il crond demone quando salvi ed esci dall'editor. Il crontab comando usa Vi come editor sottostante, perché Vi è sempre presente (anche nelle installazioni più elementari).
I nuovi file cron sono vuoti, quindi i comandi devono essere aggiunti da zero. Ho aggiunto l'esempio di definizione del lavoro di seguito ai miei file cron, proprio come riferimento rapido, quindi so cosa significano le varie parti di un comando. Sentiti libero di copiarlo per uso personale.
crontab -e
Il
le prime tre righe del codice sopra configurano un ambiente predefinito. L'ambiente deve essere impostato su tutto ciò che è necessario per un determinato utente perché cron non fornisce un ambiente di alcun tipo. Il SHELL variabile specifica la shell da utilizzare quando vengono eseguiti i comandi. Questo esempio specifica la shell Bash. Il MAILTO variabile imposta l'indirizzo e-mail a cui verranno inviati i risultati del lavoro cron. Queste e-mail possono fornire lo stato del lavoro cron (backup, aggiornamenti, ecc.) e consistono nell'output che vedresti se eseguissi il programma manualmente dalla riga di comando. La terza riga imposta il PERCORSO per l'ambiente. Anche se il percorso è impostato qui, antepongo sempre il percorso completo a ciascun eseguibile.
Ci sono diverse righe di commento nell'esempio sopra che descrivono in dettaglio la sintassi richiesta per definire un lavoro cron. Analizzerò questi comandi, quindi ne aggiungerò altri per mostrarti alcune funzionalità più avanzate dei file crontab.
01 01 * * * /usr/local/bin/rsbu -vbd1 ; /usr/local/bin/rsbu -vbd2
Questo
la riga esegue il mio script di shell Bash auto-scritto, rsbu , che esegue il backup di tutti i miei sistemi. Questo lavoro inizia ogni giorno alle 01:01 (01 01). Gli asterischi (*) nelle posizioni tre, quattro e cinque della specificazione del tempo sono come file glob, o caratteri jolly, per altre divisioni temporali; specificano "ogni giorno del mese", "ogni mese" e "ogni giorno della settimana". Questa riga esegue i miei backup due volte; uno esegue il backup su un disco rigido di backup interno dedicato e l'altro esegue il backup su un'unità USB esterna che posso portare nella cassetta di sicurezza.
La riga seguente imposta l'orologio hardware del computer utilizzando l'orologio di sistema come fonte di un'ora precisa. Questa linea sarà attiva ogni giorno alle 5:03 (03 05).
03 05 * * * /sbin/hwclock --systohc
Stavo usando il terzo e ultimo cron job (commentato) per eseguire un dnf o ehm aggiornamento alle 04:25 del primo giorno di ogni mese, ma l'ho commentato in modo che non funzioni più.
# 25 04 1 * * /usr/bin/dnf -y update
Altri trucchi per la pianificazione
Ora facciamo alcune cose che sono un po' più interessanti di queste basi. Supponiamo di voler eseguire un determinato lavoro ogni giovedì alle 15:00:
00 15 * * Thu /usr/local/bin/mycronjob.sh
O forse è necessario eseguire rapporti trimestrali dopo la fine di ogni trimestre. Il servizio cron non ha alcuna opzione per "L'ultimo giorno del mese", quindi puoi invece utilizzare il primo giorno del mese successivo, come mostrato di seguito. (Ciò presuppone che i dati necessari per i rapporti saranno pronti quando il lavoro è impostato per l'esecuzione.)
02 03 1 1,4,7,10 * /usr/local/bin/reports.sh
Di seguito viene mostrato un lavoro che viene eseguito un minuto dopo ogni ora tra le 9:01 e le 17:01
01 09-17 * * * /usr/local/bin/hourlyreminder.sh
Io
ho riscontrato situazioni in cui ho bisogno di eseguire un lavoro ogni due, tre o quattro ore. Ciò può essere ottenuto dividendo le ore per l'intervallo desiderato, ad esempio */3 ogni tre ore o 6-18/3 da eseguire ogni tre ore tra le 6:00 e le 18:00 Altri intervalli possono essere divisi in modo simile; ad esempio, l'espressione */15 nella posizione dei minuti significa "esegui il lavoro ogni 15 minuti".
*/5 08-18/2 * * * /usr/local/bin/mycronjob.sh
Una cosa da notare :le espressioni di divisione devono restituire un resto di zero per l'esecuzione del lavoro. Ecco perché, in questo esempio, il lavoro è impostato per essere eseguito ogni cinque minuti (08:05, 08:10, 08:15, ecc.) durante le ore pari dalle 8:00 alle 18:00, ma non durante le ore dispari ore numerate. Ad esempio, il lavoro non verrà eseguito affatto dalle 21:00. alle 9:59
Sono sicuro che puoi trovare molte altre possibilità sulla base di questi esempi.
Limitazione dell'accesso a cron
Gli utenti regolari con accesso cron potrebbero commettere errori che, ad esempio, potrebbero causare il sovraccarico delle risorse di sistema (come memoria e tempo della CPU). Per prevenire possibili usi impropri, l'amministratore di sistema può limitare l'accesso degli utenti creando un /etc/cron.allow file che contiene un elenco di tutti gli utenti con il permesso di creare lavori cron. Non è possibile impedire all'utente root di utilizzare cron.
Impedendo agli utenti non root di creare i propri lavori cron, potrebbe essere necessario che root aggiunga i propri lavori cron al crontab root. "Ma aspetta!" tu dici. "Non esegue quei lavori come root?" Non necessariamente. Nel primo esempio di questo articolo, il campo del nome utente mostrato nei commenti può essere utilizzato per specificare l'ID utente che un lavoro deve avere quando viene eseguito. Ciò impedisce che i lavori dell'utente non root specificato vengano eseguiti come root. L'esempio seguente mostra una definizione di lavoro che esegue un lavoro come "studente" utente:
04 07 * * * student /usr/local/bin/mycronjob.sh
Se non viene specificato alcun utente, il lavoro viene eseguito come l'utente proprietario del file crontab, in questo caso root.
cron.d
La directory /etc/cron.d è qui che alcune applicazioni, come spamAssassin e sysstat, installano i file cron. Poiché non esiste un utente spamassassin o sysstat, questi programmi necessitano di una posizione in cui individuare i file cron, quindi vengono inseriti in /etc/cron.d .
Il /etc/cron.d/sysstat il file seguente contiene i lavori cron relativi alla segnalazione delle attività di sistema (SAR). Questi file cron hanno lo stesso formato di un file cron utente.
# Run system activity accounting tool every 10 minutes
*/10 * * * * root /usr/lib64/sa/sa1 1 1
# Generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib64/sa/sa2 -A
Il file sysstat cron ha due righe che eseguono attività. La prima riga esegue sa1 programma ogni 10 minuti per raccogliere i dati archiviati in speciali file binari in /var/log/sa directory. Poi, ogni sera alle 23:53, il sa2 il programma viene eseguito per creare un riepilogo giornaliero.
Suggerimenti per la pianificazione
Alcune delle volte che ho impostato nei file crontab sembrano piuttosto casuali e in una certa misura lo sono. Cercare di programmare i lavori cron può essere difficile, soprattutto perché il numero di lavori aumenta. Di solito ho solo poche attività da programmare su ciascuno dei miei computer, il che è più semplice che in alcuni ambienti di produzione e di laboratorio in cui ho lavorato.
Un sistema che ho amministrato aveva circa una dozzina di lavori cron che venivano eseguiti ogni notte e altri tre o quattro che venivano eseguiti nei fine settimana o il primo del mese. Questa è stata una sfida, perché se troppi lavori venivano eseguiti contemporaneamente, in particolare i backup e le compilazioni, il sistema avrebbe esaurito la RAM e avrebbe quasi riempito il file di scambio, il che avrebbe provocato il crash del sistema mentre le prestazioni diminuivano, quindi non veniva fatto nulla. Abbiamo aggiunto più memoria e migliorato il modo in cui programmavamo le attività. Abbiamo anche rimosso un'attività scritta molto male e che utilizzava grandi quantità di memoria.
Il crond
il servizio presuppone che il computer host sia sempre in esecuzione. Ciò significa che se il computer viene spento durante un periodo in cui era pianificata l'esecuzione dei lavori cron, non verranno eseguiti fino alla successiva pianificazione. Ciò potrebbe causare problemi se si tratta di lavori cron critici. Fortunatamente, esiste un'altra opzione per eseguire lavori a intervalli regolari:anacron .
anacron
Il programma anacron svolge la stessa funzione di crond, ma aggiunge la possibilità di eseguire lavori che sono stati ignorati, ad esempio se il computer fosse spento o non fosse in grado di eseguire il lavoro per uno o più cicli. Questo è molto utile per laptop e altri computer che sono spenti o messi in modalità di sospensione.
Non appena
il computer è acceso e avviato, anacron verifica se i lavori configurati hanno perso l'ultima esecuzione pianificata. In tal caso, quei lavori vengono eseguiti immediatamente, ma solo una volta (non importa quanti cicli sono stati persi). Ad esempio, se un lavoro settimanale non è stato eseguito per tre settimane perché il sistema è stato spento mentre eri in ferie, sarebbe stato eseguito subito dopo aver acceso il computer, ma solo una volta, non tre.
Il programma anacron fornisce alcune semplici opzioni per eseguire attività pianificate regolarmente. Installa i tuoi script in /etc/cron.[orario|giornaliero|settimanale|mensile] directory, a seconda della frequenza con cui devono essere eseguite.
Come funziona? La sequenza è più semplice di come appare all'inizio.
- Il servizio crond esegue il lavoro cron specificato in /etc/cron.d/0hourly .
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly
- Il lavoro cron specificato in /etc/cron.d/0hourly esegue le parti di esecuzione programma una volta all'ora.
- Le parti di corsa il programma esegue tutti gli script che si trovano in /etc/cron.hourly directory.
- Il /etc/cron.hourly contiene il 0anacron script, che esegue il programma anacron utilizzando /etdc/anacrontab file di configurazione mostrato qui.
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
- Il programma anacron esegue i programmi che si trovano in /etc/cron.daily una volta al giorno; esegue i lavori che si trovano in /etc/cron.weekly una volta alla settimana e i lavori in cron.monthly una volta al mese. Nota i tempi di ritardo specificati in ciascuna riga che aiutano a prevenire la sovrapposizione di questi lavori e di altri lavori cron.
Invece di inserire programmi Bash completi in cron.X directory, le installo in /usr/local/bin directory, che mi consente di eseguirli facilmente dalla riga di comando. Quindi aggiungo un collegamento simbolico nella directory cron appropriata, come /etc/cron.daily .
Il programma Anacron
non è progettato per eseguire programmi in orari specifici. Piuttosto, ha lo scopo di eseguire programmi a intervalli che iniziano a orari specificati, ad esempio alle 3:00 (vedi START_HOURS_RANGE riga nello script appena sopra) di ogni giorno, la domenica (per iniziare la settimana) e il primo giorno del mese. Se uno o più cicli vengono persi, anacron eseguirà i lavori persi una volta, il prima possibile.
Scorciatoie
Il /etc/anacrontab il file mostrato sopra ci mostra un indizio su come possiamo usare le scorciatoie per alcuni momenti specifici e comuni. Queste scorciatoie temporali di una sola parola possono essere utilizzate per sostituire i cinque campi solitamente utilizzati per specificare gli orari. Il @ il carattere viene utilizzato per identificare i collegamenti a cron. L'elenco seguente, tratto dalla pagina man di crontab(5), mostra le scorciatoie con i loro significati equivalenti.
- @reboot :esegui una volta dopo il riavvio.
- @yearly :Esegui una volta all'anno, ad es. 0 0 1 1 *
- @annually :Esegui una volta all'anno, ad es. 0 0 1 1 *
- @monthly :Esegui una volta al mese, ad es. 0 0 1 * *
- @weekly :Esegui una volta alla settimana, ad es. 0 0 * * 0
- @daily :Esegui una volta al giorno, ad es. 0 0 * * *
- @hourly :Esegui una volta all'ora, ad es. 0 * * * *
Queste scorciatoie possono essere utilizzate in qualsiasi file crontab, come quelli in /etc/cron.d .
Ulteriori informazioni sull'impostazione dei limiti
Uso la maggior parte di questi metodi per pianificare le attività da eseguire sui miei computer. Tutte queste attività sono quelle che devono essere eseguite con i privilegi di root. È raro nella mia esperienza che gli utenti normali abbiano davvero bisogno di un cron job. Un caso era un utente sviluppatore che aveva bisogno di un lavoro cron per avviare una compilazione quotidiana in un laboratorio di sviluppo.
È importante limitare l'accesso alle funzioni cron da parte di utenti non root. Tuttavia, ci sono circostanze in cui un utente deve impostare un'attività da eseguire in orari prestabiliti e cron può consentirgli di farlo. Molti utenti non capiscono come configurare correttamente queste attività utilizzando cron e commettono errori. Questi errori possono essere innocui, ma, il più delle volte, possono causare problemi. Impostando criteri funzionali che inducono gli utenti a interagire con l'amministratore di sistema, è molto meno probabile che i singoli processi cron interferiscano con altri utenti e altre funzioni del sistema.
È possibile porre limiti alle risorse complessive che possono essere assegnate a singoli utenti o gruppi, ma questo è un articolo per un altro momento.
Punti importanti
Sintassi di cron:
cron [-f] [-l] [-L loglevel]
Opzioni:
- -f : Utilizzato per rimanere in modalità primo piano e non demonizzare.
- -l : Ciò abiliterà i nomi conformi a LSB per i file /etc/cron.d.
- -n : Utilizzato per aggiungere l'FQDN nell'oggetto durante l'invio di e-mail.
- -L livello log : Questa opzione dirà al cron cosa registrare sui lavori con i seguenti valori:
- 1 : Registrerà l'inizio di tutti i lavori cron.
- 2 : Registrerà la fine di tutti i lavori cron.
- 4 : Registrerà tutti i lavori non riusciti. Qui lo stato di uscita non sarà uguale a zero.
- 8 : Registrerà il numero di processo di tutti i lavori cron.
Il crontab (abbreviazione di "cron table") è un elenco di comandi per eseguire le attività pianificate in un momento specifico. Consente all'utente di aggiungere, rimuovere o modificare le attività pianificate. La sintassi del comando crontab ha sei campi separati da uno spazio in cui i primi cinque rappresentano il tempo per eseguire l'attività e l'ultimo è per il comando.
- Minuto (contiene un valore compreso tra 0 e 59)
- Ora (contiene un valore compreso tra 0 e 23)
- Giorno del mese (contiene un valore compreso tra 1 e 31)
- Mese dell'anno (ha un valore compreso tra 1-12 o gennaio-dicembre, devono essere utilizzate le prime tre lettere del nome del mese)
- Giorno della settimana (ha un valore compreso tra 0-6 o dom-sab, qui vanno usate anche le prime tre lettere del giorno)
- Comando
Le regole che regolano il formato del campo data e ora sono le seguenti:
- Quando uno dei primi cinque campi è impostato su un asterisco(*), indica tutti i valori del campo. Ad esempio, per eseguire un comando ogni giorno, possiamo inserire un asterisco (*) nel campo della settimana.
- Si può anche utilizzare un intervallo di numeri, separati da un trattino(-) nel campo dell'ora e della data per includere più di un valore contiguo ma non tutti i valori del campo. Ad esempio, possiamo utilizzare il 7-10 per eseguire un comando da luglio a ottobre.
- L'operatore virgola (, ) viene utilizzato per includere un elenco di numeri che possono essere o meno consecutivi. Ad esempio, "1, 3, 5" nel campo delle settimane indica l'esecuzione di un comando ogni lunedì, mercoledì e venerdì.
- È incluso un carattere barra(/) per saltare un determinato numero di valori. Ad esempio, "*/4" nel campo dell'ora specifica "ogni 4 ore" che equivale a 0, 4, 8, 12, 16, 20.
Consentire agli utenti di eseguire lavori cron:
- L'utente deve essere elencato in questo file per poter eseguire lavori cron se il file esiste.
/etc/cron.allow
- Se il file cron.allow non esiste ma esiste il file cron.deny, allora un utente non deve essere elencato in questo file per poter eseguire il lavoro cron.
/etc/cron.deny
Nota: Se nessuno di questi file esiste, solo il superutente (amministratore di sistema) potrà utilizzare un determinato comando.
Comandi di esempio:
- /home/folder/gfg-code.sh ogni ora, dalle 9:00 alle 18:00, tutti i giorni.
00 09-18 * * * /home/folder/gfg-code.sh
- /usr/local/bin/backup alle 23:30, tutti i giorni feriali.
30 23 * * Mon, Tue, Wed, Thu, Fri /usr/local/bin/backup
- Esegui sample-command.sh alle 07:30, 09:30, 13:30 e 15:30.
30 07, 09, 13, 15 * * * sample-command.sh
I seguenti punti dovrebbero essere ricordati mentre si lavora con cron:
- Disporre di un controllo della versione sorgente per tenere traccia e mantenere le modifiche alle espressioni cron.
- Organizza i lavori programmati in base alla loro importanza o frequenza e raggruppali in base alla loro azione o all'intervallo di tempo.
- Verifica il lavoro pianificato inizialmente con una frequenza elevata.
- Non scrivere codice complesso o più piping e reindirizzamento nell'espressione cron direttamente. Invece, scrivili in uno script e pianifica lo script nella scheda cron.
- Utilizza gli alias quando lo stesso insieme di comandi viene ripetuto di frequente.
- Evita di eseguire comandi o script tramite cron come utente root.
2. A
a comando è un'utilità della riga di comando utilizzata per pianificare un comando da eseguire in un determinato momento futuro. Lavori creati con al comando vengono eseguiti una sola volta. Il al comando può essere utilizzato per eseguire qualsiasi programma o posta in qualsiasi momento in futuro. Esegue i comandi a un'ora particolare e accetta orari del formato HH:MM per eseguire un lavoro a un'ora specifica del giorno. La seguente espressione come mezzogiorno, mezzanotte, l'ora del tè, domani, la prossima settimana, il prossimo lunedì, ecc. potrebbe essere utilizzata con al comando per pianificare un lavoro.
Sintassi:
at [OPTION...] runtime
Installazione a comando
Per Ubuntu/Debian:
sudo apt-get update
sudo apt-get install at
Per CentOS/Fedora:
sudo yum install at
Lavorare con a comando
at -l
o
atq
at Monday +20 minutes
at 1:45 081220
at 3pm + 4 days
# echo "shutdown -h now" | at -m 4:30
at now +5 hours
at -r 11
o
atrm 11