Crontab Linux: Guida Completa con Esempi Pratici
Crontab Linux: guida completa con esempi pratici. Impara la sintassi cron, schedule task automatici e gestisci job ricorrenti su server Linux e Unix oggi.
Cos'è Crontab
Crontab (cron table) è il sistema di scheduling dei task su sistemi Unix/Linux. Permette di eseguire comandi o script automaticamente a intervalli regolari: ogni minuto, ogni ora, ogni giorno o secondo pattern personalizzati. È fondamentale per backup automatici, manutenzione del sistema, report periodici e qualsiasi automazione server-side. Questa guida copre la sintassi completa con esempi pratici per ogni scenario.
Sintassi Base
I 5 Campi del Tempo
# Formato crontab
# ┌───────────── minuto (0 - 59)
# │ ┌───────────── ora (0 - 23)
# │ │ ┌───────────── giorno del mese (1 - 31)
# │ │ │ ┌───────────── mese (1 - 12)
# │ │ │ │ ┌───────────── giorno della settimana (0 - 6, domenica = 0)
# │ │ │ │ │
# * * * * * comando_da_eseguire
# Esempio: ogni giorno alle 3:30
30 3 * * * /scripts/backup.sh
Caratteri Speciali
| Simbolo | Significato | Esempio | Descrizione |
|---|---|---|---|
| * | Qualsiasi valore | * * * * * | Ogni minuto |
| , | Lista valori | 0,30 * * * * | Minuto 0 e 30 |
| - | Range | 0 9-17 * * * | Ore 9-17 |
| / | Step | */15 * * * * | Ogni 15 minuti |
Esempi Comuni
Frequenze di Base
# Ogni minuto
* * * * * /script.sh
# Ogni 5 minuti
*/5 * * * * /script.sh
# Ogni ora (al minuto 0)
0 * * * * /script.sh
# Ogni giorno a mezzanotte
0 0 * * * /script.sh
# Ogni giorno alle 6:30 del mattino
30 6 * * * /script.sh
# Ogni domenica alle 2:00
0 2 * * 0 /script.sh
# Primo giorno del mese alle 00:00
0 0 1 * * /script.sh
# Ogni anno (1 gennaio a mezzanotte)
0 0 1 1 * /script.sh
Pattern Avanzati
# Ogni 15 minuti durante orario lavorativo (9-18, lun-ven)
*/15 9-18 * * 1-5 /check-service.sh
# Due volte al giorno (9:00 e 18:00)
0 9,18 * * * /report.sh
# Ogni ora nei giorni feriali
0 * * * 1-5 /task.sh
# Ultimo giorno del mese (trucco)
0 0 28-31 * * [ "$(date +\%d -d tomorrow)" = "01" ] && /monthly-task.sh
# Ogni 2 ore
0 */2 * * * /task.sh
# Ogni 30 secondi (2 cron jobs)
* * * * * /script.sh
* * * * * sleep 30 && /script.sh
Stringhe Predefinite
# Alcune versioni di cron supportano stringhe speciali
@yearly # 0 0 1 1 * (ogni anno)
@annually # 0 0 1 1 * (sinonimo)
@monthly # 0 0 1 * * (ogni mese)
@weekly # 0 0 * * 0 (ogni settimana)
@daily # 0 0 * * * (ogni giorno)
@midnight # 0 0 * * * (sinonimo)
@hourly # 0 * * * * (ogni ora)
@reboot # Esegui all'avvio del sistema
# Esempio
@daily /backup/daily-backup.sh
@reboot /startup/init-services.sh
Gestione Crontab
Comandi Base
# Visualizza crontab corrente
crontab -l
# Modifica crontab (apre editor)
crontab -e
# Rimuovi tutti i cron jobs
crontab -r
# Rimuovi con conferma
crontab -i -r
# Visualizza crontab di un altro utente (richiede root)
sudo crontab -u username -l
# Modifica crontab di un altro utente
sudo crontab -u www-data -e
File di Sistema
# Crontab di sistema (diverso formato)
/etc/crontab
# Formato con utente
# min ora giorno mese dow UTENTE comando
*/5 * * * * root /scripts/system-check.sh
# Directory per script periodici
/etc/cron.hourly/ # Ogni ora
/etc/cron.daily/ # Ogni giorno
/etc/cron.weekly/ # Ogni settimana
/etc/cron.monthly/ # Ogni mese
# Basta mettere script eseguibili in queste directory
sudo cp backup.sh /etc/cron.daily/
sudo chmod +x /etc/cron.daily/backup.sh
Output e Logging
Catturare Output
# Redirect output a file
0 * * * * /script.sh >> /var/log/script.log 2>&1
# Solo errori
0 * * * * /script.sh 2>> /var/log/script-errors.log
# Scarta tutto l'output
0 * * * * /script.sh > /dev/null 2>&1
# Con timestamp
0 * * * * echo "$(date): Starting" >> /var/log/script.log && /script.sh >> /var/log/script.log 2>&1
Email Notifiche
# Invia output via email (default)
MAILTO=admin@example.com
0 6 * * * /backup.sh
# Disabilita email
MAILTO=""
0 * * * * /script.sh
# Email diverse per job diversi
MAILTO=team@example.com
0 8 * * 1 /weekly-report.sh
MAILTO=admin@example.com
0 0 * * * /daily-backup.sh
Variabili d'Ambiente
# Cron ha un ambiente minimale!
# PATH limitato, niente variabili utente
# Imposta PATH esplicito
PATH=/usr/local/bin:/usr/bin:/bin
# Imposta altre variabili
SHELL=/bin/bash
HOME=/home/user
# Nel comando stesso
0 * * * * export PATH=/usr/local/bin:$PATH && /script.sh
# Oppure nello script
#!/bin/bash
source /home/user/.bashrc
# resto dello script
Casi d'Uso
Backup Automatici
# Backup giornaliero database alle 3:00
0 3 * * * /backup/mysql-backup.sh
# Script di backup
#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_DIR=/backup/mysql
mysqldump -u root -p'password' --all-databases \
| gzip > $BACKUP_DIR/all-databases-$DATE.sql.gz
# Mantieni solo ultimi 7 giorni
find $BACKUP_DIR -type f -mtime +7 -delete
Pulizia Log
# Pulizia settimanale log vecchi
0 4 * * 0 /cleanup/clean-logs.sh
#!/bin/bash
# Rimuovi log più vecchi di 30 giorni
find /var/log/app -name "*.log" -mtime +30 -delete
# Comprimi log della settimana scorsa
find /var/log/app -name "*.log" -mtime +7 -mtime -30 \
-exec gzip {} \;
Monitoraggio
# Check servizi ogni 5 minuti
*/5 * * * * /monitor/check-services.sh
#!/bin/bash
if ! curl -sf http://localhost:8080/health > /dev/null; then
echo "Service down!" | mail -s "ALERT" admin@example.com
systemctl restart myservice
fi
Sincronizzazione
# Sync con server remoto ogni ora
0 * * * * rsync -avz /local/data/ user@remote:/backup/
# Sync solo in orario notturno (basso traffico)
0 1-5 * * * rsync -avz --bwlimit=10000 /data/ user@remote:/backup/
Debugging
Problemi Comuni
# 1. Script non esegue
# - Verifica PATH
# - Usa percorsi assoluti
# - Controlla permessi (chmod +x)
# - Aggiungi shebang (#!/bin/bash)
# 2. Test manuale
# Esegui come farebbe cron
/bin/sh -c '/path/to/script.sh'
# 3. Log di cron
# Debian/Ubuntu
grep CRON /var/log/syslog
# CentOS/RHEL
grep CRON /var/log/cron
# 4. Verifica sintassi online
# Usa strumenti come crontab.guru
Debug Avanzato
# Wrapper per debug
#!/bin/bash
LOG=/var/log/cron-debug.log
echo "=== $(date) ===" >> $LOG
echo "PWD: $(pwd)" >> $LOG
echo "PATH: $PATH" >> $LOG
echo "USER: $(whoami)" >> $LOG
env >> $LOG
/actual/script.sh >> $LOG 2>&1
echo "Exit code: $?" >> $LOG
Sicurezza
# Limita accesso a cron
# /etc/cron.allow - utenti permessi
# /etc/cron.deny - utenti negati
# Se cron.allow esiste, SOLO quegli utenti possono usare cron
echo "deploy" >> /etc/cron.allow
# Non mettere password negli script!
# Usa file di configurazione sicuri
chmod 600 /etc/mysql-backup.cnf
# Nello script
mysqldump --defaults-file=/etc/mysql-backup.cnf
Alternative Moderne
# Systemd timers (più flessibile di cron)
# /etc/systemd/system/backup.timer
[Unit]
Description=Daily backup timer
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target
# Attiva
systemctl enable --now backup.timer
systemctl list-timers
Strumenti Online
Per costruire e validare espressioni cron:
- Cron Expression Builder - Costruisci espressioni visualmente
- Regex Tester - Testa pattern per log parsing
- Hash Generator - Verifica integrità backup
Conclusione
Crontab è essenziale per l'automazione server:
- Backup: Automatizza salvataggi regolari
- Manutenzione: Pulizia log, rotazione file
- Monitoring: Check periodici servizi
- Report: Generazione automatica statistiche
Ricorda: usa sempre percorsi assoluti, gestisci l'output, e testa gli script manualmente prima di schedulare.
Per altri strumenti utili, esplora i nostri tool online gratuiti. Per la documentazione completa, consulta man crontab(5).