Crontab Linux: Guida Completa con Esempi Pratici

THEJORD Team5 min di lettura
linuxcrontabautomationdevops

Crontab Linux: guida completa con esempi pratici. Impara la sintassi cron, schedule task automatici e gestisci job ricorrenti su server Linux e Unix oggi.

Crontab Linux: Guida Completa con Esempi Pratici

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

SimboloSignificatoEsempioDescrizione
*Qualsiasi valore* * * * *Ogni minuto
,Lista valori0,30 * * * *Minuto 0 e 30
-Range0 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:

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