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écuterOpé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
[email protected]
*/5 * * * * /home/user/scripts/backup.shCrontab 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.shErreurs 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>&1Exemples pratiques
*/5 * * * *— run every 5 minutes0 0 * * *— run once a day at midnight0 9 * * 1-5— run at 9 AM on weekdays0 0 1 * *— run at midnight on the 1st of every month0 0 * * 0— run at midnight every Sunday