107.2 Lezione 1
Certificazione: |
LPIC-1 |
---|---|
Versione: |
5.0 |
Argomento: |
107 Attività Amministrative |
Obiettivo: |
107.2 Automatizzare le attività di amministrazione del sistema attraverso la pianificazione |
Lezione: |
1 di 2 |
Introduzione
Uno dei compiti più importanti di un buon amministratore di sistema è quello di programmare i job che devono essere eseguiti regolarmente. Per esempio, un amministratore può creare e automatizzare job per i backup, gli aggiornamenti del sistema e l’esecuzione di molte altre attività ripetitive. Per fare questo si può usare la funzione cron
, che è utile per automatizzare la programmazione di job periodici.
Pianificare i Lavori con Cron
In Linux, cron
è un demone che è in esecuzione continua e ogni minuto controlla un insieme di tabelle per trovare compiti da eseguire. Queste tabelle sono note come crontabs e contengono i cosiddetti cron jobs. Cron è adatto a server e sistemi che sono costantemente accesi, perché ogni lavoro cron viene eseguito solo se il sistema è in funzione all’ora prevista. Può essere usato dagli utenti ordinari, ognuno dei quali ha il proprio crontab
, così come l’utente root che gestisce i crontab di sistema.
Note
|
In Linux c’è anche la funzione |
Crontab Utente
I crontab utente sono file di testo che gestiscono la programmazione di lavori cron definiti dall’utente. Hanno sempre il nome dell’account utente che li ha creati, ma la posizione di questi file dipende dalla distribuzione utilizzata (generalmente una sottodirectory di /var/spool/cron
).
Ogni linea in un crontab utente contiene sei campi separati da uno spazio:
-
Il minuto dell’ora (0-59).
-
L’ora del giorno (0-23).
-
Il giorno del mese (1-31).
-
Il mese dell’anno (1-12).
-
Il giorno della settimana (0-7 con domenica=0 o domenica=7).
-
Il comando da eseguire.
Per il mese dell’anno e il giorno della settimana puoi usare le prime tre lettere del nome invece del numero corrispondente.
I primi cinque campi indicano quando eseguire il comando specificato nel sesto campo e possono contenere uno o più valori. In particolare, è possibile specificare più valori utilizzando:
*
(asterisco)-
Si riferisce a qualsiasi valore.
,
(virgola)-
Specifica una lista di valori possibili.
-
(trattino)-
Specifica un intervallo di valori possibili.
/
(slash)-
Specifica valori spezzati.
Molte distribuzioni includono il file /etc/crontab
che può essere usato come riferimento per il layout di un file cron
. Ecco un esempio di file /etc/crontab
da un’installazione Debian:
SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # 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
Crontab di Sistema
I crontab di sistema sono file di testo che gestiscono la programmazione dei cron job di sistema e possono essere modificati solo dall’utente root. /etc/crontab
e tutti i file nella directory /etc/cron.d
sono crontab di sistema.
Molte distribuzioni includono anche le directory /etc/cron.hourly
, /etc/cron.daily
, /etc/cron.weekly
e /etc/cron.monthly
che contengono script da eseguire con la frequenza appropriata. Per esempio, se vuoi eseguire uno script ogni giorno puoi metterlo in /etc/cron.daily
.
Warning
|
Alcune distribuzioni usano |
La sintassi dei crontab di sistema è simile a quella dei crontab utente, tuttavia richiede anche un ulteriore campo obbligatorio che specifica quale utente eseguirà il cron job. Pertanto, ogni linea in un crontab di sistema contiene sette campi separati da uno spazio:
-
Il minuto dell’ora (0-59).
-
L’ora del giorno (0-23).
-
Il giorno del mese (1-31).
-
Il mese dell’anno (1-12).
-
Il giorno della settimana (0-7 con domenica=0 o domenica=7).
-
Il nome dell’account utente che esegue il comando.
-
Il comando da eseguire.
Come per i crontab utente, è possibile specificare valori multipli per i campi dell’ora usando gli operatori *
, ,
, -
e /
. È possibile anche indicare il mese dell’anno e il giorno della settimana con le prime tre lettere del nome invece del numero corrispondente.
Particolari Specifiche di Tempo
Quando si modificano i file crontab, si possono anche usare scorciatoie speciali nelle prime cinque colonne al posto delle specifiche di tempo:
@reboot
-
Esegue il compito specificato una volta dopo il riavvio.
@hourly
-
Esegue il task specificato una volta all’ora all’inizio dell’ora.
@daily
(o@midnight
)-
Esegue il task specificato una volta al giorno a mezzanotte.
@weekly
-
Esegue il task specificato una volta alla settimana alla mezzanotte della domenica.
@monthly
-
Esegue il task specificato una volta al mese alla mezzanotte del primo giorno del mese.
@yearly
(o@annually
)-
Esegue il task specificato una volta all’anno alla mezzanotte del 1° Gennaio.
Variabili Crontab
All’interno di un file crontab, ci sono talvolta assegnazioni di variabili definite prima che i compiti programmati siano dichiarati. Le variabili d’ambiente comunemente impostate sono:
HOME
-
La directory dove
cron
invoca i comandi (di default la home directory dell’utente). MAILTO
-
Il nome dell’utente o l’indirizzo a cui lo standard output ed error sono inviati per posta (di default il proprietario di crontab). Sono ammessi anche valori multipli separati da virgola e un valore vuoto indica che non deve essere inviata alcun messaggio.
PATH
-
Il percorso dove i comandi possono essere trovati.
SHELL
-
La shell da usare (di default
/bin/sh
).
Creare Attività di Cron Utente
Il comando crontab
è usato per mantenere i file crontab per i singoli utenti. In particolare, è possibile eseguire il comando crontab -e
per modificare il proprio file crontab o per crearne uno se non esiste già.
$ crontab -e no crontab for frank - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/ed 2. /bin/nano < ‑‑‑‑ easiest 3. /usr/bin/emacs24 4. /usr/bin/vim.tiny Choose 1-4 [2]:
Per impostazione predefinita, il comando crontab
apre l’editor specificato dalle variabili d’ambiente VISUAL
o EDITOR
, così puoi iniziare a modificare il tuo file crontab con l’editor preferito. Alcune distribuzioni, come mostrato nell’esempio sopra, ti permettono di scegliere l’editor da una lista quando crontab
viene eseguito per la prima volta.
Se vuoi eseguire lo script foo.sh
situato nella tua directory home ogni giorno alle 10:00, puoi aggiungere la seguente linea al tuo file crontab:
0 10 * * * /home/frank/foo.sh
Considerate le seguenti voci di crontab di esempio:
0,15,30,45 08 * * 2 /home/frank/bar.sh 30 20 1-15 1,6 1-5 /home/frank/foobar.sh
Nella prima linea lo script bar.sh
viene eseguito ogni martedì alle 08:00, alle 08:15, alle 08:30 e alle 08:45. Nella seconda linea lo script foobar.sh
viene eseguito alle 08:30 da lunedì a venerdì per i primi quindici giorni di gennaio e giugno.
Warning
|
Anche se i file crontab possono essere modificati manualmente, si raccomanda sempre di usare il comando |
Oltre all’opzione -e
menzionata sopra, il comando crontab
ha altre opzioni utili:
-l
-
Visualizza il crontab corrente sullo standard output.
-r
-
Rimuove il crontab corrente.
-u
-
Specifica il nome dell’utente il cui crontab deve essere modificato. Questa opzione richiede i privilegi di root e permette all’utente root di modificare i file crontab degli utenti.
Creare Attività di Cron di Sistema
A differenza dei crontab degli utenti, i crontab di sistema sono aggiornati usando un editor: quindi non è necessario eseguire il comando crontab
per modificare /etc/crontab
e i file in /etc/cron.d
. Ricorda che, quando modifichi i crontab di sistema, devi specificare l’account che sarà usato per eseguire il cron job (di solito l’utente root).
Per esempio: se vuoi eseguire lo script barfoo.sh
situato nella directory /root
ogni giorno alle 01:30, puoi aprire /etc/crontab
con il tuo editor preferito e aggiungere la seguente linea:
30 01 * * * root /root/barfoo.sh >>/root/output.log 2>>/root/error.log
Nell’esempio precedente, lo standard output del lavoro viene aggiunto a /root/output.log
, mentre gli errori vengono aggiunti a /root/error.log
.
Warning
|
A meno che l’output sia reindirizzato a un file come nell’esempio precedente (o la variabile |
Configurare l’Accesso alla Pianificazione delle Attività
In Linux i file /etc/cron.allow
e /etc/cron.deny
sono usati per impostare le restrizioni di crontab
. In particolare, sono usati per permettere o meno la pianificazione delle attività cron
agli utenti. Se /etc/cron.allow
esiste, solo gli utenti non root elencati al suo interno possono creare cron job usando il comando crontab
. Se /etc/cron.allow
non esiste ma esiste /etc/cron.deny
, solo gli utenti non-root elencati in questo file non possono creare cron job usando il comando crontab
(in questo caso un /etc/cron.deny
vuoto significa che ogni utente è autorizzato). Se nessuno di questi file esiste, l’accesso dell’utente alla pianificazione delle attività di cron dipende dalla distribuzione usata.
Note
|
I file |
Una Alternativa a Cron
Usando systemd come gestore di sistemi e servizi, puoi impostare timers come alternativa a cron
per pianificare delle attività. I timer sono file di unità di systemd identificati dal suffisso .timer
, e per ognuno di questi deve esserci un corrispondente file di unità che descrive l’unità da attivare allo scadere del timer. Per impostazione predefinita, un timer
attiva un servizio con lo stesso nome, tranne che per il suffisso.
Un timer include una sezione [Timer]
che specifica quando le attività programmate dovrebbero essere eseguite. In particolare, si può usare l’opzione OnCalendar=
per definire dei temporizzatori in tempo reale che funzionano allo stesso modo dei cron job (sono basati su espressioni di eventi del calendario). L’opzione OnCalendar=
richiede la seguente sintassi:
DayOfWeek Year-Month-Day Hour:Minute:Second
con DayOfWeek
opzionale. Gli operatori *
, /
e ,
hanno lo stesso significato di quelli usati per i cron job, mentre puoi usare ..
tra due valori per indicare un intervallo contiguo. Per la specifiche di DayOfWeek
, puoi usare le prime tre lettere del nome o il nome completo.
Note
|
È possibile anche definire dei temporizzatori monotonici che si attivano dopo che è trascorso un certo tempo da un punto di partenza specifico (per esempio, quando la macchina è stata avviata o quando il timer stesso viene attivato). |
Per esempio, se vuoi eseguire il servizio chiamato /etc/systemd/system/foobar.service
alle 05:30 del primo lunedì di ogni mese, puoi aggiungere le seguenti linee nel corrispondente file /etc/systemd/system/foobar.timer
.
[Unit] Description=Run the foobar service [Timer] OnCalendar=Mon *-*-1..7 05:30:00 Persistent=true [Install] WantedBy=timers.target
Una volta creato il nuovo timer, puoi abilitarlo e avviarlo eseguendo i seguenti comandi come root:
# systemctl enable foobar.timer # systemctl start foobar.timer
Puoi cambiare la frequenza del tuo lavoro programmato, modificando il valore OnCalendar
e poi digitando il comando systemctl daemon-reload
.
Infine, se vuoi vedere la lista dei timer attivi ordinati in base al tempo, puoi usare il comando systemctl list-timers
. Puoi aggiungere l’opzione --all
per vedere anche i timer inattivi.
Note
|
Ricorda che i timer sono registrati nel journal di systemd e puoi rivedere i log delle diverse unità usando il comando |
Invece della forma normalizzata più lunga di cui sopra, si possono usare alcune espressioni speciali che descrivono particolari frequenze di esecuzione dell’attività:
hourly
-
Esegue il compito specificato una volta all’ora all’inizio dell’ora.
daily
-
Esegue il task specificato una volta al giorno a mezzanotte.
weekly
-
Esegue l’attività specificata una volta alla settimana alla mezzanotte del lunedì.
monthly
-
Esegue l’attività specificata una volta al mese alla mezzanotte del primo giorno del mese.
yearly
-
Esegue l’attività specificata una volta all’anno alla mezzanotte del primo giorno di gennaio.
Puoi vedere le pagine del manuale per la lista completa delle specifiche di ora e data in systemd.timer(5)
.
Esercizi Guidati
-
Per ciascuna delle seguenti scorciatoie
crontab
, indicare la specifica temporale corrispondente (cioè le prime cinque colonne in un filecrontab
utente):@hourly
@daily
@weekly
@monthly
@annually
-
Per ciascuna delle seguenti scorciatoie
OnCalendar
, indicare la specifica temporale corrispondente (la forma normalizzata più lunga):hourly
daily
weekly
monthly
yearly
-
Spiega il significato delle seguenti specifiche temporali che si trovano in un file
crontab
:30 13 * * 1-5
00 09-18 * * *
30 08 1 1 *
0,20,40 11 * * Sun
00 09 10-20 1-3 *
*/20 * * * *
-
Spiega il significato delle seguenti specifiche temporali usate nell’opzione
OnCalendar
di un file timer:*-*-* 08:30:00
Sat,Sun *-*-* 05:00:00
*-*-01 13:15,30,45:00
Fri *-09..12-* 16:20:00
Mon,Tue *-*-1,15 08:30:00
*-*-* *:00/05:00
Esercizi Esplorativi
-
Supponendo che tu sia autorizzato a pianificate attività con
cron
come utente ordinario, quale comando useresti per creare il tuo file crontab? -
Crea un semplice lavoro pianificato che esegua il comando
date
ogni venerdì alle 01:00 pm. Dove puoi vedere l’output di questo lavoro? -
Crea un altro lavoro pianificato che esegua lo script
foobar.sh
ogni minuto, reindirizzando l’output al fileoutput.log
nella tua home directory in modo che solo lo standard error ti venga inviato per e-mail. -
Guarda la voce
crontab
dell’attività pianificata appena creata. Perché non è necessario specificare il percorso assoluto del file in cui viene salvato lo standard output ? E perché puoi usare il comando./foobar.sh
per eseguire lo script? -
Modifica la voce precedente di
crontab
rimuovendo il reindirizzamento dell’output e disabilita il primo cron job che hai creato. -
Come puoi inviare lo standard output ed error del tuo lavoro pianificato all’account utente
emma
via e-mail? E come si può invece evitarlo? -
Esegui il comando
ls -l /usr/bin/crontab
. Quale bit speciale è impostato e qual è il suo significato?
Sommario
In questa lezione abbiamo imparato:
-
Usare
cron
per eseguire attività a intervalli regolari. -
Gestire i lavori cron.
-
Configurare l’accesso degli utenti alla pianificazione dei lavori cron.
-
Comprendere il ruolo dei timer di systemd come alternativa a
cron
.
I seguenti comandi e file sono stati discussi in questa lezione:
crontab
-
Mantiene i file
crontab
per i singoli utenti. /etc/cron.allow
e/etc/cron.deny
-
File particolari usati per impostare le restrizioni di
crontab
. /etc/crontab
-
File crontab di sistema.
/etc/cron.d
-
La directory che contiene i file crontab di sistema.
systemctl
-
Controlla systemd e il gestore dei servizi. In relazione ai timer, può essere usato per abilitarli e avviarli.
Risposte agli Esercizi Guidati
-
Per ciascuna delle seguenti scorciatoie
crontab
, indicare la specifica temporale corrispondente (cioè le prime cinque colonne in un filecrontab
utente):@hourly
0 * * * *
@daily
0 0 * * *
@weekly
0 0 * * 0
@monthly
0 0 1 * *
@annually
0 0 1 1 *
-
Per ciascuna delle seguenti scorciatoie
OnCalendar
, indicare la specifica temporale corrispondente (la forma normalizzata più lunga):hourly
*-*-* *:00:00
daily
*-*-* 00:00:00
weekly
Mon *-*-* 00:00:00
monthly
*-*-01 00:00:00
yearly
*-01-01 00:00:00
-
Spiega il significato delle seguenti specifiche temporali per un file
crontab
:30 13 * * 1-5
Alle 01:30 pm tutti i giorni della settimana da lunedì a venerdì
00 09-18 * * *
Ogni giorno e ogni ora dalle 09.00 am alle 06.00 pm
30 08 1 1 *
Alle 08:30 am del primo giorno di gennaio
0,20,40 11 * * Sun
Ogni domenica alle 11:00, 11:20 e 11:40 am
00 09 10-20 1-3 *
Alle 09:00 am dal 10 al 20 gennaio, febbraio e marzo
*/20 * * * *
Ogni 20 minuti
-
Spiega il significato delle seguenti specifiche temporali usate nell’opzione
OnCalendar
di un file timer:*-*-* 08:30:00
Ogni giorno alle 08:30 am
Sat,Sun *-*-* 05:00:00
Alle 05:00 am il sabato e la domenica
*-*-01 13:15,30,45:00
Alle 01:15 pm, 01:30 pm e 01:45 pm il primo giorno del mese
Fri *-09..12-* 16:20:00
Alle 04:20 pm tutti i venerdì a settembre, ottobre, novembre e dicembre
Mon,Tue *-*-1,15 08:30:00
Alle 08.30 am il primo e il quindicesimo giorno di ogni mese solo se il giorno è un lunedì o un martedì
*-*-* *:00/05:00
Ogni 5 minuti
Risposte agli Esercizi Esplorativi
-
Supponendo che tu sia autorizzato a pianificate attività con
cron
come utente ordinario, quale comando useresti per creare il tuo file crontab?dave@hostname ~ $ crontab -e no crontab for dave - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/ed 2. /bin/nano < ---- easiest 3. /usr/bin/emacs24 4. /usr/bin/vim.tiny Choose 1-4 [2]:
-
Crea un semplice lavoro pianificato che esegua il comando
date
ogni venerdì alle 01:00 pm. Dove puoi vedere l’output di questo lavoro?00 13 * * 5 date
L’output viene inviato per posta all’utente; per visualizzarlo, puoi usare il comando
mail
. -
Crea un altro lavoro pianificato che esegua lo script
foobar.sh
ogni minuto, reindirizzando l’output al fileoutput.log
nella tua home directory in modo che solo lo standard error ti venga inviato per e-mail.*/1 * * * * ./foobar.sh >> output.log
-
Guarda la voce
crontab
dell’attività pianificata appena creata. Perché non è necessario specificare il percorso assoluto del file in cui viene salvato lo standard output ? E perché puoi usare il comando./foobar.sh
per eseguire lo script?cron
invoca i comandi dalla home directory dell’utente, a meno che un’altra posizione sia specificata dalla variabile d’ambienteHOME
all’interno del filecrontab
. Per questo motivo, puoi usare il percorso relativo del file di output ed eseguire lo script con./foobar.sh
. -
Modifica la voce precedente di
crontab
rimuovendo il reindirizzamento dell’output e disabilita il primo cron job che hai creato.#00 13 * * 5 date */1 * * * * ./foobar.sh
Per disabilitare un cron job, puoi semplicemente commentare la linea corrispondente nel file
crontab
. -
Come puoi inviare lo standard output ed error del tuo lavoro pianificato all’account utente
emma
via e-mail? E come si può invece evitarlo?Per inviare lo standard output ed error, devi impostare la variabile d’ambiente
MAILTO
nel tuo filecrontab
come segue:MAILTO="emma"
Per dire a
cron
che non deve essere inviata alcuna mail, puoi assegnare un valore vuoto alla variabile d’ambienteMAILTO
.MAILTO=""
-
Esegui il comando
ls -l /usr/bin/crontab
. Quale bit speciale è impostato e qual è il suo significato?$ ls -l /usr/bin/crontab -rwxr-sr-x 1 root crontab 25104 feb 10 2015 /usr/bin/crontab
Il comando
crontab
ha il bit SGID impostato (il caratteres
al posto del flag eseguibile per il gruppo), il che significa che viene eseguito con i privilegi del gruppo (quindicrontab
). Questo è il motivo per cui gli utenti ordinari possono modificare il loro filecrontab
usando il comandocrontab
. Si noti che molte distribuzioni hanno i permessi sui file impostati in modo tale che i filecrontab
possano essere modificati solo tramite il comandocrontab
.