# Riferimento Rapido Cron

*Pianificazione job, sintassi crontab, stringhe speciali, logging*

> Source: crontab(5) Manual Page · MIT

## 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

| Command | Description |
|---------|-------------|
| `*` | 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

| Command | Description |
|---------|-------------|
| `@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

| Command | Description |
|---------|-------------|
| `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
MAILTO=admin@example.com
HOME=/home/deploy
* * * * * /opt/myjob.sh
```

### Note sull'Ambiente

| Command | Description |
|---------|-------------|
| `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

| Command | Description |
|---------|-------------|
| `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

| Command | Description |
|---------|-------------|
| `/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

| Command | Description |
|---------|-------------|
| `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
```
