# Explication de la commande crontab

Le démon cron (crond) est un service d'arrière-plan sur les systèmes d'exploitation Unix qui exécute des commandes planifiées. Il lit la configuration dans les fichiers crontab (tables cron), qui définissent quand et à quelle fréquence chaque commande doit s'exécuter.

## Syntaxe

La commande crontab gère les fichiers crontab par utilisateur :

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

## Options

- **`-e`**: Édite le crontab de l'utilisateur actuel dans l'éditeur par défaut ($VISUAL ou $EDITOR). Le nouveau crontab est installé à la fermeture de l'éditeur.
- **`-l`**: Affiche le crontab de l'utilisateur actuel sur la sortie standard.
- **`-r`**: Supprime entièrement le crontab de l'utilisateur actuel.
- **`-i`**: Demande une confirmation avant la suppression (utilisé avec -r).
- **`-u user`**: Opère sur le crontab de l'utilisateur spécifié au lieu du vôtre. Nécessite les privilèges root.
- **`file`**: Installe le crontab à partir du fichier donné. Utilisez - pour l'entrée standard.

## Format du fichier crontab

Chaque ligne d'un fichier crontab est soit une affectation de variable d'environnement, un commentaire (commençant par #), soit une tâche cron avec ce format :

```
┌───────────── minute (0–59)
│ ┌───────────── heure (0–23)
│ │ ┌───────────── jour du mois (1–31)
│ │ │ ┌───────────── mois (1–12 ou JAN–DEC)
│ │ │ │ ┌───────────── jour de la semaine (0–6 ou SUN–SAT)
│ │ │ │ │
* * * * *  commande à exécuter
```

## Opérateurs de champ

- *** (asterisk)**: Correspond à toutes les valeurs possibles du champ.
- **, (comma)**: Spécifie une liste de valeurs. Exemple : 1,15 dans le champ jour du mois signifie le 1er et le 15.
- **- (hyphen)**: Définit une plage inclusive. Exemple : 9-17 dans le champ heure signifie chaque heure de 9 à 17.
- **/ (slash)**: Définit un pas. Exemple : */10 dans le champ minute signifie toutes les 10 minutes. Peut être combiné avec une plage : 1-30/5.

## Chaînes spéciales

Au lieu des cinq champs de temps, vous pouvez utiliser l'une de ces chaînes abrégées :

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

## Variables d'environnement

Vous pouvez définir des variables d'environnement en haut d'un fichier crontab. Les plus courantes :

- **SHELL**: Le shell utilisé pour exécuter les commandes (par défaut : /bin/sh).
- **PATH**: Le chemin de recherche des commandes. Le PATH par défaut de cron est minimal (généralement /usr/bin:/bin), utilisez donc toujours des chemins absolus ou définissez PATH explicitement.
- **MAILTO**: Où envoyer la sortie des commandes. Définissez à "" pour supprimer les e-mails. Par défaut, la sortie est envoyée par e-mail au propriétaire du crontab.
- **CRON_TZ**: Définit le fuseau horaire du crontab (non pris en charge sur tous les systèmes). Sans cela, cron utilise le fuseau horaire du système.

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

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

## Crontab système vs. crontab utilisateur

Les crontabs utilisateur (édités avec crontab -e) ont cinq champs de temps plus la commande. Le crontab système (/etc/crontab) et les fichiers dans /etc/cron.d/ ont un champ supplémentaire entre les champs de temps et la commande : le nom d'utilisateur sous lequel la commande s'exécute.

Exemple de crontab système :

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

## Erreurs courantes

### % (percent sign)

Le signe pourcentage (%) a une signification spéciale dans crontab : il est converti en saut de ligne, et tout ce qui suit le premier % est envoyé comme entrée standard à la commande. Pour utiliser un % littéral, échappez-le avec \%.

```
# 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 s'exécute avec un PATH minimal. Les scripts qui dépendent de commandes dans /usr/local/bin ou d'autres répertoires doivent utiliser des chemins absolus ou définir PATH en haut du crontab.

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

Lorsque le jour du mois et le jour de la semaine sont tous deux restreints (pas *), cron exécute la commande quand l'un ou l'autre correspond (logique OU), pas quand les deux correspondent. Par exemple, 0 0 1 * 5 s'exécute à minuit le 1er de chaque mois ET chaque vendredi.

### Timezone

Cron utilise le fuseau horaire du système par défaut. Si votre serveur est en UTC mais que vous voulez des tâches dans un fuseau horaire local, utilisez CRON_TZ (si pris en charge) ou convertissez les heures manuellement.

### Output and logging

Par défaut, cron envoie toute sortie (stdout et stderr) au propriétaire du crontab. Pour rendre une tâche silencieuse, redirigez la sortie : command > /dev/null 2>&1. Pour journaliser la sortie, redirigez vers un fichier : 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
```

## Exemples pratiques

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

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

---

Maintained by Jsmon — https://jsmon.sh
