Comment programmer des tâches planifiées sur Raspberry Pi ?


Programmer le lancement de commandes ou de scripts sur un Raspberry Pi, et sur Linux de manière plus générale, n’est vraiment pas évident pour un débutant
Il faut trouver le bon endroit pour les programmer, et connaitre la bonne syntaxe (celle du crontab notamment n’est vraiment pas intuitive)
La bonne nouvelle c’est que je vais tout vous expliquer aujourd’hui, et vous donner des astuces pour gagner du temps par la suite

Comment programmer des tâches planifiées sur Raspberry Pi ?
Les scripts peuvent être programmés principalement à partir d’un outil appelé « crontab »
Il vous permet de lancer des tâches avec le compte que vous voulez, soit au démarrage du Raspberry Pi, soit à une heure précise

Qu’est-ce que c’est que ce truc ?
Je vais tout vous dire, restez attentifs 🙂

Qu’est-ce que le crontab ?

Cron

Le cron est un service, lancé automatiquement au démarrage du système, qui permet à un utilisateur de lancer des taches planifiées

Chaque minute, le cron regarde s’il doit lancer quelque chose, et si oui le fait
Ce que nous allons voir aujourd’hui c’est comment demander au cron de lancer une commande ou un script au moment voulu

Crontab

Le crontab est un outil qui vous permet d’indiquer la liste des tâches à lancer, dans un format qui pourra être lu par le service cron

Le crontab contient deux éléments :
– la liste des commandes à lancer
– l’indication du moment ou il faut les lancer

Crontab est aussi une commande, voici sa syntaxe :
crontab -u utilisateur fichier
crontab [-u utilisateur] [-l | -r | -e] [-i] [-s]

Voici ce les détails des options utiles :

  • u : le crontab s’ouvrira avec l’utilisateur en cours, sauf si vous précisez un utilisateur particulier avec cette option (à condition d’avoir les autorisations nécessaires)
  • l : permet simplement de lister la configuration actuelle
  • e : permet de modifier la configuration
  • r : permet de remettre à zéro toute la configuration actuelle

La plupart du temps, vous allez utiliser uniquement les commandes « crontab -l » et « crontab -e »

Comment programmer une tâche ?

Un premier exemple de tâche planifiée

J’espère que tout va bien jusque la, il est maintenant temps de passer à l’action
Nous allons planifier une tâche toute simple en utilisant la commande suivante :
crontab -e

La première chose à faire, est de choisir votre éditeur favori. Je vous recommande de rester avec nano (option par défaut), donc juste d’appuyer sur Entrée :

pi@raspberrypi:~ $ crontab -e
no crontab for pi - using an empty one

Select an editor. To change later, run 'select-editor'.
1. /bin/ed
2. /bin/nano <---- easiest
3. /usr/bin/vim.tiny

Choose 1-3 [2]:

Vous voilà maintenant dans l’éditeur du crontab, qui doit être pratiquement vide et peut faire un peu peur si vous n’êtes jamais venu ici 🙂
Pas de panique, je vais tout vous expliquer

Tout d’abord, toutes les lignes qui comment par un # sont des commentaires, elles ne font rien du tout et vous pouvez les ignorer (cela doit être l’essentiel actuellement)
Nous allons faire nos changements à la fin du fichier, déplacez votre curseur tout en bas avec la flèche du bas, et copiez cette ligne :
* * * * echo date >> /home/pi/log

Enregistrez le fichier (CTRL+O puis entrée) et quittez (CTRL+X)

Cette ligne ajoutée dans le crontab va nous permettre d’exécuter une commande chaque minute, qui va écrire la date dans un fichier
Après quelques minutes, le fichier contiendra toutes les dates d’exécution de la commande

Vous vous demandez probablement ce que les 5 étoiles signifient
La syntaxe d’une entrée dans le crontab est la suivante :
1 2 3 4 5 command

  • 1 : minutes (entre 0 et 59)
  • 2 : heures (entre 0 et 23)
  • 3 : jour (entre 1 et 31)
  • 4 : mois (entre 1 et 12)
  • 5 : jour de la semaine (entre 0 et 7, cela débute au dimanche)

Un autre exemple simple

Maintenant que vous avez vu la théorie, regardons un second exemple pour être sûr que c’est clair pour vous
Imaginez que vous devez lancer une sauvegarde chaque mercredi à minuit
Il vous faudra donc ajouter une ligne de ce genre :
0 0 * * 3 /home/pi/backup.sh

Les deux premiers zéro pour lancer à minuit, le 3 pour indiquer de lancer uniquement le mercredi

D’autres exemples

Comme vous l’aurez compris, il y a pas mal d’autres possibilités pour programmer exactement ce que vous voulez dans le crontab
Voici quelques exemples supplémentaires :

  • Lancer un script à heures fixes :
    0 6,12 * * * /home/pi/backup.sh
    Ce script tournera à 6 h et 12 h uniquement
  • Lancer un script toutes les deux heures :
    0 */2 * * * /home/pi/backup.sh
    Sera lancé toutes les 2 h, donc minuit, 2 h, 4 h, 6 h, etc.
  • Pour lancer uniquement la semaine (hors week-end) :
    0 3 * * 1-5 /home/pi/backup.sh
  • Et vous pouvez aussi utiliser un mot clé comme celui-ci pour lancer un script au démarrage :
    @reboot /home/pi/backup.sh

Déboguer

Nous verrons en fin d’article comment trouver pourquoi un cron ne s’est pas lancé, ou en tout cas pas à l’heure que vous imaginiez
Mais avant cela, il peut être intéressant d’enregistrer les messages affichés à l’exécution ou les erreurs dans un fichier

Pour cela, voici quelques possibilités d’ajouts dans le crontab :

  • Afin d’enregistrer dans un fichier le texte généré par le script au lancement (ce qui se serait affiché à l’écran si lancé à la main), il faut ajouter le nom d’un fichier précédé du caractère « > » :
    @reboot /home/pi/backup.sh > /home/pi/log_backup.txt
  • L’option précédente va écraser le fichier à chaque exécution, ce n’est pas forcément l’idéal pour identifier un problème.
    Pour ajouter le texte à la fin du fichier, utilisez alors le symbole « >> » comme ceci :
    @reboot /home/pi/backup.sh >> /home/pi/log_backup.txt
  • Maintenant, si vous souhaitez également enregistrer les erreurs du script dans un fichier, vous pouvez le faire comme cela :
    @reboot /home/pi/backup.sh > /home/pi/log_backup.txt 2>/home/pi/errors_backup.txt
  • Et enfin, ma même chose, mais en enregistrant à la fois les erreurs et les logs dans le même fichier :
    @reboot /home/pi/backup.sh > /home/pi/log_backup.txt 2>&1

Vous commencez maintenant à connaitre quelques astuces, mais malheureusement dans l’informatique, tout ne marche pas toujours comme prévu 🙂
Je vais donc vous donner quelques astuces supplémentaires pour régler les erreurs les plus fréquentes avec les tâches planifiées sur Raspberry Pi

Astuces d’utilisation du crontab

Les droits des utilisateurs

Sans doute l’erreur la plus fréquente lorsque l’on crée un script et aussi un cron est d’oublier de prendre en compte les autorisations de l’utilisateur en question

Par exemple, cette tâche si elle est lancée par un utilisateur non autorisé (pi par exemple) ne fonctionnera pas :
@reboot /usr/sbin/service ssh start

L’erreur suivante sera générée :
Failed to start ssh.service: Interactive authentication required.

Lorsque vous modifier le crontab, les scripts indiqués à l’intérieur seront lancés avec l’utilisateur en cours
Pi n’étant pas autorisé à démarrer un service, cela ne fonctionnera pas

Pour que ce genre de tâche fonctionne, il faut ajouter cette ligne dans le crontab de root (sudo crontab -e) ou dans le fichier crontab global, situé dans /etc/crontab

Chemin absolu

Une autre erreur très répandue est de créer des crons sans prendre en compte le chemin
Il faut absolument utiliser le chemin complet des scripts ou fichiers pour que cela fonctionne correctement

Ce genre de cron peut ne pas marcher :
@reboot service ssh start

Lors du lancement, le système n’a aucune idée de l’emplacement du fichier service
Donc il faudrait écrire /usr/sbin/service par exemple pour que cela fonctionne correctement

Faites aussi attention au contenu de vos scripts
Si par exemple vous avez un script PHP qui inclue un autre fichier (disons « fichier.php »), et que vous lancez le script principal dans un cron, il y a de fortes chances que cela ne fonctionne pas
Encore une fois, peut-être que le cron aura bien l’info de l’emplacement du fichier principal, mais pas de « fichier.php »

Soit il faut modifier le PHP pour inclure le chemin complet lors de l’inclusion, soit vous pouvez faire quelque chose comme ça :
@reboot cd /var/www/html; /usr/bin/php test.php
Cela permet de changer l’emplacement avant de lancer le script, et donc d’éviter le problème lors de l’inclusion de fichiers

Déboguer facilement

Pour finir, je vais maintenant vous donner deux méthodes pour aider au debug de vos tâches planifiées

Emails

Le service cron essayera d’envoyer un email à l’utilisateur lorsqu’il y a une erreur avec l’un de ses tâches planifiées
Si vous avez un serveur mail installé sur votre Raspberry Pi, vous pouvez déjà vérifier les erreurs sur l’adresse associée à votre utilisateur

Sinon, vous pouvez installer le nécessaire avec la commande :
sudo apt install mailutils

Après cela, utilisez la commande « mail » pour lire les e-mails reçus

Si vous avez configuré correctement le serveur mail, il est possible de rediriger toutes les erreurs sur une autre adresse, en ajoutant ceci dans le crontab :
MAIL=votreadresse@domaine.com

Syslog

Syslog est une autre aide précieuse lorsqu’il s’agit d’identifier un problème avec vos tâches planifiées
Il s’agit d’un fichier de log, situé ici : /var/log/syslog

Vous pouvez afficher les derniers messages d’erreurs en continu avec cette commande :
tail -f /var/log/syslog | grep CRON

Cela affichera uniquement les toutes dernières erreurs, avec une actualisation automatique lorsque qu’une nouvelle tâche se lance

Conclusion

Vous savez maintenant ce que cron et crontab sont, comme planifier une tâche ou un script sur Raspberry Pi, avec plein d’options possibles pour trouver ce qui n’a pas marché de la manière attendue

Les crons sont quelque chose de fondamental sur Raspberry Pi et sur Linux en général
J’espère que vous avez maintenant mieux compris comment cela fonctionne, ça devrait vous servir très souvent

Si vous avez le moindre doute lors de la planification d’une nouvelle tâche, sachez qu’il existe des sites web vous permettant soit de créer la planification (pour la copier/coller ensuite dans crontab), soit de vérifier que ce que vous avez mis est correct
Par exemple, le site crontab.guru fait cela très bien

Patrick Fromaget

Je suis l'auteur principal et le créateur de RaspberryTips. Mon but est de vous aider sur tous vos problèmes qui concernent Raspberry Pi and publiant des guides détaillés et des tutorials rapides. Dans la vraie vie, je suis administrateur système (Linux principalement) avec un expérience dans le développement web.

Recent Content