Come Pianificare Operazioni con Cron

Posted on by

I comandi Crontab (cron deriva dal greco chronos che significa tempo e Tab che significa scheda/tavola) si trovano in sistemi operativi Unix e Unix-like, e sono utilizzati per programmare attività da eseguire periodicamente. Per vedere i comandi Crontab attualmente in esecuzione sul sistema, è possibile aprire un terminale ed eseguire:

sudo crontab -l
Per modificare l’elenco dei cronjobs è possibile eseguire:
sudo crontab -e
Questo comando aprirà l’editor di default (potrebbe essere vi o pico) per manipolare il crontab. Se si salva e si esce dall’editor, tutti i cronjobs vengono salvati nel crontab. I Cronjobs sono scritti nel seguente formato:
* * * * * /bin/execute/this/script.sh
Istruzioni di scheduling

Come potete vedere ci sono 5 stelle. Le stelle rappresentano parti differenti di una data nel seguente ordine:

1. minuto (da 0 a 59)
2. ora (da 0 a 23)
3. giorno del mese (da 1 a 31)
4. mese (da 1 a 12)
5. giorno della settimana (da 0 a 6) (0=Domenica)

La stella, o un asterisco, indicano un valore qualsiasi. Usiamo nuovamente l’esempio precedente per capire meglio:

* * * * * /bin/execute/this/script.sh
Sono tutti asterischi! Questo significa che il comando /bin/execute/this/script.sh: verrà eseguito ogni minuto di ogni ora di ogni giorno del mese di ogni mese e ogni giorno della settimana.
Se vogliamo programmare lo script per l’esecuzione alle 01:00 di ogni Venerdì, avremmo bisogno dei seguenti cronjob:

0 1 * * 5 /bin/execute/this/script.sh
Se vogliamo programmare lo script per l’esecuzione alle 01:00 di ogni giorno dal Lunedi al Venerdì, avremmo bisogno dei seguenti cronjob:

0 1 * * 1-5 /bin/execute/this/script.sh
Per eseguire uno script ogni 10 minuti :
0,10,20,30,40,50 * * * * /bin/execute/this/script.sh
Per il primo campo si può anche utilizzare una parola invece di un numero:
@reboot Run once, at startup
@yearly Run once a year “0 0 1 1 *”
@annually (same as @yearly)
@monthly Run once a month “0 0 1 * *”
@weekly Run once a week “0 0 * * 0”
@daily Run once a day “0 0 * * *”
@midnight (same as @daily)
@hourly Run once an hour “0 * * * *

Lasciando il resto dei campi vuoti:

@daily /bin/execute/this/script.sh

Memorizzare l’output di crontab

Di default Cron salva l’output di /bin/execute/this/script.sh nella casella postale dell’utente (root in questo caso) ma è preferibile che l’output venga salvato in un file di registro separato. Ecco come fare:
*/10 * * * * /bin/execute/this/script.sh 2>&1 >> /var/log/script_output.log

Linux può salvare i log a diversi livelli: Standard output (STDOUT) e standard errors (stderr). Il valore che identifica STDOUT è 1, quello che identifica STDERR è 2. Ad esempio per salvare STDERR in STDOUT :
2>&1

Se vogliamo ad esempio salvare il log dentro /var/log/script_output.log:
>> /var/log/script_output.log

Se invece si vogliono inviare i log ad un’altra casella di posta si potrà utilizzare il seguente comando:

MAILTO=”yourname@yourdomain.com”

Se si vuole ricevere il log solo nella propria casella ssicurarsi che il pacchetto mailx sia installato e cambiare il cronjob così:
*/10 * * * * /bin/execute/this/script.sh 2>&1 | mail -s “Cronjob ouput” yourname@yourdomain.com

Category: Guide