Par Claire Vernet — 29 septembre 2026
Dans sa forme standard, une tâche utilise cinq champs temporels suivis de la commande ; Debian cron accepte aussi des raccourcis comme @reboot, @daily et @hourly. Sur Raspberry Pi OS, il convient aux sauvegardes, relevés de capteurs et scripts de maintenance simples.
Créer et vérifier son premier cron job
Cette tâche ajoute la date dans un fichier toutes les minutes afin de vérifier le fonctionnement de cron de bout en bout.
-
Ouvrez votre crontab personnelle :
crontab -e -
Ajoutez cette ligne, puis enregistrez :
* * * * * /usr/bin/date >> "$HOME/cron-test.log" 2>&1 -
Vérifiez que la tâche est installée :
crontab -l -
Après une à deux minutes, contrôlez le résultat :
tail -n 5 "$HOME/cron-test.log"Le fichier doit contenir une nouvelle ligne datée à chaque exécution.
-
Rouvrez
crontab -eet supprimez uniquement la ligne de test.
Attention au format et à l’utilisateur :
crontab -emodifie la crontab du compte courant. Dans sa forme standard, une tâche comporte cinq champs temporels suivis de la commande ; une chaîne spéciale comme @reboot, @daily ou @hourly remplace ces cinq champs.sudo crontab -eprogramme la tâche sousroot. Dans/etc/crontabet les fichiers de/etc/cron.d, un champ utilisateur supplémentaire doit être placé entre les cinq champs temporels et la commande.
Sur les nouvelles installations de Raspberry Pi OS, le compte pi n’est plus créé par défaut ; Raspberry Pi Imager permet de choisir le compte lors de la préparation de la carte. Utilisez $HOME, $HOME/scripts ou un chemin explicite comme /home/<utilisateur> correspondant au propriétaire de la crontab.
Comprendre la syntaxe cron
Dans sa forme standard, une entrée de crontab personnelle contient cinq champs de planification suivis de la commande. Les chaînes spéciales comme @reboot, @daily ou @hourly remplacent ces cinq champs.
# minute heure jour_du_mois mois jour_de_la_semaine commande
0 3 * * * "$HOME/scripts/backup.sh"
*/15 * * * * /usr/bin/python3 "$HOME/scripts/check-temp.py"
0 8 * * 1 "$HOME/scripts/weekly-report.sh"
| Champ | Valeurs | Exemple |
|---|---|---|
| Minute | 0–59 | */15 : toutes les 15 minutes |
| Heure | 0–23 | 3 : à 3 heures |
| Jour du mois | 1–31 | 1 : le premier du mois |
| Mois | 1–12 | * : chaque mois |
| Jour de semaine | 0–7 | 1 : lundi |
Si le jour du mois et le jour de la semaine sont tous deux restreints, cron exécute la commande lorsque l’un ou l’autre correspond.
Le caractère % est spécial dans la partie commande d’une crontab : s’il n’est pas échappé, cron le transforme en saut de ligne et transmet la suite sur l’entrée standard. Écrivez \% lorsque la commande doit recevoir un signe pourcentage littéral, par exemple avec date +\%F.
Rendre une tâche cron fiable
Cron définit automatiquement HOME, LOGNAME et SHELL, mais son environnement est plus limité qu’une session interactive. LANG, DISPLAY ou certaines variables applicatives peuvent manquer ; déclarez uniquement celles dont le script dépend.
Employez des chemins absolus pour les exécutables et redirigez les deux flux pour conserver les messages :
0 3 * * * /usr/bin/python3 "$HOME/scripts/backup.py" >> "$HOME/backup.log" 2>&1
Sans redirection, cron peut envoyer la sortie par courriel si un service de messagerie est configuré. Pour empêcher deux exécutions simultanées, utilisez un verrou non bloquant :
*/5 * * * * /usr/bin/flock -n "$HOME/.script.lock" "$HOME/scripts/script.sh"
Dépanner un cron job qui ne fonctionne pas
Cette checklist comporte 8 contrôles, du lancement manuel du script jusqu’au fuseau horaire.
| Contrôle | Cause à vérifier | Action |
|---|---|---|
| 1. Échec manuel | Erreur du script | Lancer la commande exacte avec le même utilisateur. |
| 2. Tâche absente | Mauvaise crontab | Contrôler la ligne avec crontab -l. |
| 3. Commande introuvable | Chemin incorrect ou PATH limité |
Utiliser command -v, puis inscrire le chemin absolu. |
| 4. Script non exécutable directement | Bit d’exécution absent, shebang invalide ou interpréteur introuvable | Vérifier ls -l et la première ligne du script. Utiliser chmod +x avec un shebang valide, ou appeler explicitement l’interpréteur, par exemple /bin/bash script.sh ou /usr/bin/python3 script.py. |
| 5. Résultat différent | Variable ou répertoire courant manquant | Déclarer la variable nécessaire et employer des chemins absolus. |
| 6. Aucune exécution visible | Service arrêté ou événement cron absent | systemctl status cron --no-pager, puis sudo journalctl -u cron --since today --no-pager. |
| 7. Mauvais droits ou fichiers | Tâche exécutée par un autre compte | Ajoutez temporairement /usr/bin/id >> "$HOME/cron-debug.log" 2>&1 dans la crontab concernée, attendez une exécution, puis vérifiez l’UID et le nom du compte enregistrés dans le fichier. |
| 8. Mauvaise heure | Fuseau du système | Contrôler la date et le fuseau avec timedatectl. |
Les journaux de l’unité cron montrent les événements du service ; ils ne remplacent pas la sortie du script. Consultez cette dernière dans le fichier défini par >> fichier.log 2>&1.
Cron ou timer systemd sur Raspberry Pi ?
Une entrée de crontab classique ne rattrape pas une échéance manquée pendant que le Raspberry Pi était éteint. Debian cron applique toutefois un traitement spécifique à certains changements d’horloge inférieurs à trois heures. Un timer systemd configuré avec OnCalendar= et Persistent=true déclenche une activation si au moins une échéance a été manquée pendant l’arrêt du Raspberry Pi, sans rejouer nécessairement chaque occurrence.
| Critère | Cron | Timer systemd |
|---|---|---|
| Planification | Cinq champs temporels, ou une chaîne spéciale comme @reboot, dans une crontab | OnCalendar= dans une unité .timer |
| Échéance manquée pendant l’arrêt | Non rattrapée | Rattrapée avec Persistent=true pour un timer OnCalendar= |
| Journaux | Redirection ou messagerie à configurer | stdout et stderr sont envoyés par défaut dans le journal de l’unité .service, sauf redirection explicite avec StandardOutput= ou StandardError=. |
| Dépendances | À gérer dans la commande ou le script | Dépendances et ordre de démarrage déclarables dans les unités |
| Unité déjà active | Une nouvelle commande peut démarrer et chevaucher la précédente | Le service déjà actif n’est pas relancé |
| Usage adapté | Tâche périodique simple | Service supervisé ou dépendant de l’état du système |
Pour préparer le système, consultez le tutoriel Raspberry Pi Imager. Pour administrer ensuite la machine à distance, suivez le guide SSH headless sur Raspberry Pi.
Sources techniques
Les commandes et comportements décrits reposent sur les manuels de Debian Trixie et la documentation officielle Raspberry Pi.
- Manuel Debian crontab(5) : syntaxe et environnement
- Manuel Debian crontab(1) : édition et consultation
- Manuel Debian cron(8) : fonctionnement du service
- Manuel Debian flock(1) : verrouillage des exécutions
- Manuel Debian systemd.timer(5)
- Manuel Debian journalctl(1)
- Manuel Debian timedatectl(1)
- Manuel Debian systemd.exec(5)
- Manuel Debian systemd.unit(5)
- Raspberry Pi : retrait du compte pi par défaut
FAQ sur cron et Raspberry Pi
Ces réponses couvrent quatre points importants pour configurer et dépanner cron.
Cron définit-il la variable HOME ?
Oui. Debian indique que cron définit automatiquement HOME, LOGNAME et SHELL ; LANG et DISPLAY ne sont pas garantis de la même manière.
Pourquoi un script fonctionne-t-il dans le terminal mais pas avec cron ?
Le PATH n’est qu’une cause possible : vérifiez aussi les chemins, les permissions, le shebang, les variables, l’utilisateur, les sorties et le fuseau horaire.
Faut-il utiliser le chemin /home/pi ?
Non. Utilisez $HOME ou /home/<utilisateur>, car le compte pi n’est plus créé par défaut.
Quand préférer un timer systemd à cron ?
Préférez un timer systemd lorsqu’une tâche doit rattraper une échéance manquée avec OnCalendar= et Persistent=true, ou dépendre d’un service et de ses journaux.