GNU/Linux >> Linux Esercitazione >  >> Linux

Come uso cron in Linux

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 ci si aspetta che nessuno utilizzi 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ò programmare attività su base ripetitiva, ad esempio giornaliera, settimanale o mensile.

In questo articolo, introdurrò il servizio cron e come usarlo.

Usi comuni (e non comuni) 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.

Utilizzo di crontab

L'utilità cron viene eseguita in base ai comandi specificati in una tabella cron (crontab ). Ogni utente, compreso il 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 utilizzato anche per modificare un file cron (vedi lo script sotto). Ti consiglio vivamente di non usa un editor standard (come Vi, Vim, Emacs, Nano o uno qualsiasi dei tanti altri editor disponibili). 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
SHELL=/bin/bash
[email protected]
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

# backup using the rsbu program to the internal 4TB HDD and then 4TB external
01 01 * * * /usr/local/bin/rsbu -vbd1 ; /usr/local/bin/rsbu -vbd2

# Set the hardware clock to keep it in sync with the more accurate system clock
03 05 * * * /sbin/hwclock --systohc

# Perform monthly updates on the first of the month
# 25 04 1 * * /usr/bin/dnf -y update

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.

Nell'esempio sopra sono presenti diverse righe di commento che descrivono in dettaglio la sintassi richiesta per definire un processo 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

Questa riga esegue il mio script di shell Bash auto-scritto, rsbu , che esegue il backup di tutti i miei sistemi. Questo lavoro inizia all'01:01 (01 01) ogni giorno. Gli asterischi (*) nelle posizioni tre, quattro e cinque della specificazione temporale 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 siano pronti quando il processo viene 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

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 risultare in 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

Più risorse Linux

  • Comandi Linux cheat sheet
  • Cheat sheet sui comandi avanzati di Linux
  • Corso online gratuito:Panoramica tecnica RHEL
  • Cheat sheet della rete Linux
  • Cheat sheet di SELinux
  • Cheat sheet dei comandi comuni di Linux
  • Cosa sono i container Linux?
  • I nostri ultimi articoli su Linux

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 l'autorizzazione a 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" dell'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 sottostante 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 servizio crond 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 viene 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.

  1. 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

  1. Il lavoro cron specificato in /etc/cron.d/0hourly esegue le parti di esecuzione programma una volta all'ora.
  2. Le parti di corsa il programma esegue tutti gli script che si trovano in /etc/cron.hourly directory.
  3. 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

  1. 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. Prendi nota dei tempi di ritardo specificati in ogni riga che aiutano a impedire che questi lavori si sovrappongano a se stessi e ad 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 lavoro cron. 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.

Per ulteriori informazioni, le pagine man di cron, crontab, anacron, anacrontab e run-parts contengono tutte informazioni e descrizioni eccellenti su come funziona il sistema cron.

Questo articolo è stato originariamente pubblicato a novembre 2017 ed è stato aggiornato per includere ulteriori informazioni.


Linux
  1. Come usare BusyBox su Linux

  2. Come usare cron su Linux

  3. Come usare TROVA in Linux

  4. Come usare Unzip in Linux

  5. Come usare il comando Su in Linux

Come utilizzare lo schermo Linux

Come elencare i lavori Cron in Linux

Come usare du Command in Linux

Come utilizzare il terminale Linux in Android

Come utilizzare il comando sysctl in Linux

Come utilizzare il comando di arresto di Linux