RIFERIMENTO RAPIDO CRON
Pianificazione job, sintassi crontab, stringhe speciali, logging
Sintassi
Formato Crontab
# ┌───── minute (0-59)
# │ ┌───── hour (0-23)
# │ │ ┌───── day of month (1-31)
# │ │ │ ┌───── month (1-12)
# │ │ │ │ ┌───── day of week (0-7, 0&7=Sun)
# * * * * * command
Valori dei Campi
| * | Qualsiasi valore (wildcard) |
| , | Lista valori: 1,3,5 |
| - | Intervallo: 1-5 |
| / | Passo: */10 (ogni 10) |
| 0-59 | Intervallo minuti |
| 0-23 | Intervallo ore |
| 1-31 | Intervallo giorno del mese |
| 1-12 | Intervallo mese (o JAN-DEC) |
| 0-7 | Giorno della settimana (0&7=Dom, o SUN-SAT) |
Stringhe Speciali
Pianificazioni Shorthand
| @reboot | Esegui una volta all'avvio |
| @yearly | 0 0 1 1 * — una volta all'anno (1 gen) |
| @monthly | 0 0 1 * * — una volta al mese (il 1°) |
| @weekly | 0 0 * * 0 — una volta a settimana (domenica) |
| @daily | 0 0 * * * — una volta al giorno (mezzanotte) |
| @hourly | 0 * * * * — una volta all'ora |
Esempi
Pianificazioni Comuni
30 2 * * * /usr/local/bin/backup.sh
0 9 * * 1-5 /opt/report.sh
*/15 * * * * /usr/bin/health-check.sh
0 0 1 * * /opt/monthly-cleanup.sh
0 8,17 * * * /opt/notify.sh
Spiegazione delle Pianificazioni
| 30 2 * * * | Ogni giorno alle 2:30 |
| 0 9 * * 1-5 | Giorni feriali alle 9:00 |
| */15 * * * * | Ogni 15 minuti |
| 0 0 1 * * | Primo giorno del mese, mezzanotte |
| 0 8,17 * * * | Ogni giorno alle 8 e alle 17 |
Ambiente
Impostare Variabili
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
[email protected]
HOME=/home/deploy
* * * * * /opt/myjob.sh
Note sull'Ambiente
| SHELL | Shell usata per i comandi (default /bin/sh) |
| PATH | Percorso di ricerca (il default di cron è minimale) |
| MAILTO | Invia output a questo indirizzo (vuoto = nessuna mail) |
| HOME | Directory home per il job cron |
Logging
Output e Logging
# redirect stdout + stderr to a log file
*/5 * * * * /opt/job.sh >> /var/log/job.log 2>&1
# discard all output
0 3 * * * /opt/job.sh > /dev/null 2>&1
# log only errors
0 3 * * * /opt/job.sh > /dev/null 2>> /var/log/job-err.log
Visualizzare i Log Cron
# Debian / Ubuntu (syslog)
grep CRON /var/log/syslog
# RHEL / CentOS
cat /var/log/cron
# journalctl (systemd)
journalctl -u cron --since "1 hour ago"
Pianificazioni Comuni
Pattern Frequenti
| 0 * * * * | Ogni ora esatta |
| */5 * * * * | Ogni 5 minuti |
| */30 * * * * | Ogni 30 minuti |
| 0 0 * * * | Ogni giorno a mezzanotte |
| 0 6 * * 1 | Ogni lunedì alle 6 |
| 0 0 1,15 * * | Il 1° e il 15 del mese |
| 0 0 * * 5 | Ogni venerdì a mezzanotte |
| 0 0 1 1 * | Ogni 1° gennaio |
Comandi crontab
Gestire i Crontab
crontab -e # edit your crontab
crontab -l # list your crontab
crontab -r # remove your crontab
crontab -u alice -l # list another user's (root)
crontab /path/to/file # install crontab from file
Posizioni Crontab di Sistema
| /etc/crontab | Crontab di sistema (ha campo utente) |
| /etc/cron.d/ | File cron drop-in |
| /etc/cron.daily/ | Script eseguiti giornalmente |
| /etc/cron.hourly/ | Script eseguiti ogni ora |
| /etc/cron.weekly/ | Script eseguiti settimanalmente |
| /etc/cron.monthly/ | Script eseguiti mensilmente |
| /var/spool/cron/ | Storage crontab per utente |
Consigli
Best Practice
| Usa percorsi assoluti | Il PATH di cron è minimale; usa sempre percorsi completi |
| Redirige l'output | Evita flood di email con > /dev/null 2>&1 |
| Lock file | Usa flock per evitare esecuzioni sovrapposte |
| Testa prima | Esegui il comando manualmente prima di pianificarlo |
| Usa MAILTO | Imposta MAILTO="" per sopprimere tutte le email |
| Controlla il fuso orario | Cron usa l'ora di sistema; verifica con date |
Prevenire Sovrapposizioni con flock
# only run if not already running
* * * * * /usr/bin/flock -n /tmp/job.lock /opt/job.sh