# Spiegazione del comando crontab

Il demone cron (crond) è un servizio in background sui sistemi operativi Unix che esegue comandi pianificati. Legge la configurazione dai file crontab (tabelle cron), che definiscono quando e con quale frequenza ogni comando deve essere eseguito.

## Sintassi

Il comando crontab gestisce i file crontab per ogni utente:

```
crontab [-u user] [-l | -r | -e | -i] [file]
```

## Opzioni

- **`-e`**: Modifica il crontab dell'utente corrente nell'editor predefinito ($VISUAL o $EDITOR). Il nuovo crontab viene installato dopo la chiusura dell'editor.
- **`-l`**: Visualizza il crontab dell'utente corrente sullo standard output.
- **`-r`**: Rimuove completamente il crontab dell'utente corrente.
- **`-i`**: Richiede conferma prima della rimozione (usato con -r).
- **`-u user`**: Opera sul crontab dell'utente specificato anziché sul proprio. Richiede privilegi root.
- **`file`**: Installa il crontab dal file indicato. Usare - per lo standard input.

## Formato del file crontab

Ogni riga in un file crontab è un'assegnazione di variabile d'ambiente, un commento (che inizia con #) o un cron job con questo formato:

```
┌───────────── minuto (0–59)
│ ┌───────────── ora (0–23)
│ │ ┌───────────── giorno del mese (1–31)
│ │ │ ┌───────────── mese (1–12 o JAN–DEC)
│ │ │ │ ┌───────────── giorno della settimana (0–6 o SUN–SAT)
│ │ │ │ │
* * * * *  comando da eseguire
```

## Operatori dei campi

- *** (asterisk)**: Corrisponde a ogni valore possibile per il campo.
- **, (comma)**: Specifica un elenco di valori. Esempio: 1,15 nel campo giorno del mese indica il 1° e il 15.
- **- (hyphen)**: Definisce un intervallo inclusivo. Esempio: 9-17 nel campo ora indica ogni ora dalle 9 alle 17.
- **/ (slash)**: Definisce un passo. Esempio: */10 nel campo minuto indica ogni 10 minuti. Può essere combinato con un intervallo: 1-30/5.

## Stringhe speciali

Al posto dei cinque campi temporali, è possibile utilizzare una di queste stringhe abbreviate:

| String | Equivalent |
|--------|-----------|
| `@yearly` / `@annually` | `0 0 1 1 *` |
| `@monthly` | `0 0 1 * *` |
| `@weekly` | `0 0 * * 0` |
| `@daily` / `@midnight` | `0 0 * * *` |
| `@hourly` | `0 * * * *` |
| `@reboot` | `Run once at startup` |

## Variabili d'ambiente

È possibile impostare variabili d'ambiente all'inizio di un file crontab. Le più comuni sono:

- **SHELL**: La shell usata per eseguire i comandi (predefinita: /bin/sh).
- **PATH**: Il percorso di ricerca per i comandi. Il PATH predefinito di cron è minimale (di solito /usr/bin:/bin), quindi usare sempre percorsi assoluti o impostare PATH esplicitamente.
- **MAILTO**: Dove inviare l'output dei comandi. Impostare a "" per disattivare l'email. Per impostazione predefinita, l'output viene inviato al proprietario del crontab.
- **CRON_TZ**: Imposta il fuso orario per il crontab (non supportato su tutti i sistemi). Senza di esso, cron usa il fuso orario del sistema.

```
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=admin@example.com

*/5 * * * * /home/user/scripts/backup.sh
```

## Crontab di sistema vs. crontab utente

I crontab utente (modificati con crontab -e) hanno cinque campi temporali più il comando. Il crontab di sistema (/etc/crontab) e i file in /etc/cron.d/ hanno un campo aggiuntivo tra i campi temporali e il comando: il nome utente con cui viene eseguito il comando.

Esempio di crontab di sistema:

```
# /etc/crontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m  h  dom mon dow user    command
*/15 *  *   *   *   root    /usr/local/bin/system-check.sh
0    2  *   *   *   backup  /usr/local/bin/nightly-backup.sh
```

## Problemi comuni

### % (percent sign)

Il segno di percentuale (%) ha un significato speciale in crontab: viene tradotto in un carattere di nuova riga, e tutto ciò che segue il primo % viene inviato come standard input al comando. Per usare un % letterale, occorre farne l'escape con \%.

```
# Wrong — the % will be interpreted
0 0 * * * echo "Date: $(date +%Y-%m-%d)"

# Correct — escape the %
0 0 * * * echo "Date: $(date +\%Y-\%m-\%d)"
```

### PATH

Cron viene eseguito con un PATH minimale. Gli script che dipendono da comandi in /usr/local/bin o altre directory dovrebbero usare percorsi assoluti o impostare PATH all'inizio del crontab.

### Day-of-month + day-of-week

Quando sia il giorno del mese che il giorno della settimana sono vincolati (non *), cron esegue il comando quando uno dei due campi corrisponde (logica OR), non quando entrambi corrispondono. Ad esempio, 0 0 1 * 5 viene eseguito a mezzanotte il 1° di ogni mese E ogni venerdì.

### Timezone

Cron usa il fuso orario del sistema per impostazione predefinita. Se il server è in UTC ma si desidera eseguire i job in un fuso orario locale, utilizzare CRON_TZ (se supportato) o convertire gli orari manualmente.

### Output and logging

Per impostazione predefinita, cron invia tutto l'output (stdout e stderr) al proprietario del crontab. Per silenziare un job, reindirizzare l'output: command > /dev/null 2>&1. Per registrare l'output, reindirizzare su un file: command >> /var/log/myjob.log 2>&1.

```
# Discard all output
*/5 * * * * /path/to/script.sh > /dev/null 2>&1

# Log output to a file
*/5 * * * * /path/to/script.sh >> /var/log/myscript.log 2>&1
```

## Esempi pratici

- [`*/5 * * * *`](https://crontab.run/it/every-5-minutes) — run every 5 minutes
- [`0 0 * * *`](https://crontab.run/it/daily) — run once a day at midnight
- [`0 9 * * 1-5`](https://crontab.run/it/every-weekday-at-9am) — run at 9 AM on weekdays
- [`0 0 1 * *`](https://crontab.run/it/every-month) — run at midnight on the 1st of every month
- [`0 0 * * 0`](https://crontab.run/it/every-sunday) — run at midnight every Sunday

Canonical: https://crontab.run/it/command

---

Maintained by Jsmon — https://jsmon.sh
