Formation PUB100 : Travailler avec un Mac, 2020 Opérations diverses

11.29 Lancer une tâche de façon automatique (crontab)


Il est possible de demander à macOS ou à Linux de lancer une tâche automatiquement de façon récurrente à un moment donné, par exemple à une date et heure précise ou encore à toutes les heures.

Je vais vous montrer comment faire à l'aide de l'utilitaire cron.

cron peut lancer à peu près n'importe quelle tâche. Habituellement, les tâches seront regroupées dans un fichier bash. C'est ce fichier qui sera lancé automatiquement.

Suivez ces étapes pour y arriver :

  • D'abord, assurez-vous que votre système soit à jour et que le fuseau horaire soit bien configuré. Sinon, la date et l'heure que vous aurez entrées dans le crontab ne correspondront pas à la réalité.
  • Écrivez le fichier bash pour qu'il lance les tâches que vous souhaitez. Pour ma part, j'aime bien faire d'abord un test à l'aide d'un petit fichier bash qui inscrit la date et l'heure courantes dans un fichier texte, dont je vous fournis le code dans un instant.

    Note : c'est une bonne habitude de placer tous les fichiers utilisés par des tâches cron dans le même dossier, par exemple /Users/monnom/Documents/scripts sous macOS ou /home/pi/scripts sous Linux.

    Remarquez que sous macOS, lorsque le nom du fichier bash se termine par .command, ceci permet de lancer également le fichier en double-cliquant sur son nom dans le Finder. Si vous lui donnez une extension .bash, il devra être lancé en ligne de commande.

    Sous Linux, on utilisera l'extension .bash.

    Voici donc le code de ce fichier bash. Vous devrez bien sûr ajuster le chemin du fichier datecourante.txt.
    Fichier test.bash

    date >> /Users/monnom/Documents/datecourante.txt

  • Donnez les droits d'exécution au fichier bash.
    Terminal

    chmod 755/Users/monnom/Documents/scripts/test.bash

  • Avant de passer à l'automatisation, vérifiez le bon fonctionnement du fichier.

    Sous macOS, ceci est réalisé en double-cliquant sur son nom dans le Finder.

    Sous Linux, lancez cette commande alos que vous êtes dans le dossier du script :

    Terminal

    ./test.bash

  • Ouvrez ensuite le fichier texte mentionné dans le fichier bash (/Users/monnom/Documents/datecourante.txt). Vous devriez y voir la date courante.
    Fichier /Users/monnom/Documents/datecourante.txt

    Sat Sep 3 07:20:00 EDT 2022

  • Maintenant que vous savez que le bash fonctionne, vous pouvez automatiser son lancement. Lancez cette commande :
    Terminal

    crontab -e

    Ceci créera un fichier pour l'usager actif dans lequel ses tâches automatiques seront listées.

    Sous macOS, le fichier sera automatiquement ouvert dans l'éditeur Vim.
    Sous Linux, vous avez le choix entre différents éditeurs. Je vous suggère nano puisqu'il est plus intuitif.

    Dans Vim, Pour passer en mode insertion, appuyez sur la lettre i.

  • Pour déterminer le moment où une tâche doit être lancée, il faut utiliser la syntaxe crontab. Cette syntaxe est expliquée au bas de cette fiche.
  • Vous devez entrer une commande par ligne et vous assurer de faire un saut de ligne après la dernière commande. Dans cet exemple, je demande à lancer le fichier bash à toutes les minutes.

    Fichier cron

    * * * * * /Users/monnom/Documents/scripts/test.bash

  • Quand vous avez terminé, sous Vim, appuyez sur Échap puis appuyez sur les touches :, w et q (Write and Quit).

    Sous Nano, appuyez sur Ctrl + X.

  • Pour lister les tâches actives, entrez cette commande :
    Terminal

    crontab -l

    Si vous ne voyez rien, assurez-vous d'avoir fait un retour à la fin de la commande dans le fichier cron.

    Si tout a fonctionné, vous verrez votre commande à l'écran.

    Résultat à l'écran

    monnom@MacBook-Pro-de-MonNom ~ %crontab -l
    * * * * * /Users/monnom/Documents/scripts/test.bash

  • Il ne reste plus qu'à attendre que le moment spécifié survienne (ici, à chaque minute). Vérifiez le fichier texte et vous devriez voir une nouvelle ligne apparaître à chaque minute.

Une fois que vous avez réussi votre exploit à l'aide du fichier bash de test, n'oubliez pas d'enlever cette ligne dans votre fichier cron sinon, vous ralentirez votre ordinateur inutilement.

Vous pouvez maintenant ajuster votre fichier cron pour lancer le fichier bash qui répond à votre besoin!

Emplacement du fichier cron

Il n'est pas nécessaire de savoir où est stocké le fichier cron pour pouvoir l'utiliser mais sachez qu'il y aura un fichier pour chaque usager qui définit des tâches automatiques.

macOS

Si vous êtes curieux et souhaitez voir ces fichiers, vous pouvez lancer ces commandes :

Terminal

sudo su
cd /var/at/tabs
ls

Résultat à l'écran

monnom@MacBook-Pro-de-MonNom ~ %sudo su
Password:
sh-3.2# cd /var/at/tabs
sh-3.2# ls
monnom
sh-3.2#

Il est même possible de voir le contenu brut de ce fichier à l'aide de la commande cat. Mais n'allez surtout pas l'éditer directement!

Résultat à l'écran

sh-3.2# cat monnom
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.cGQAftQAd8 installed on Sat Sep 3 07:26:01 2022)
# (Cron version -- $FreeBSD: src/usr.sbin/cron/crontab/crontab.c,v 1.24 2006/09/03 17:52:19 ru Exp $)
* * * * * /Users/monnom/Documents/scripts/test.bash

Linux

Sous Linux (ici : Raspberry Pi OS), lancez plutôt cette commande :

Terminal

sudo ls /var/spool/cron/crontabs/

Résultat à l'écran

pi@raspberrypi:~ $ sudo ls /var/spool/cron/crontabs/
pi

On voit ici qu'il y a un fichier pour l'usager pi.

Afficher le contenu de ce fichier donnera le même résultat que la commande crontab -l.

Résultat à l'écran

pi@raspberrypi:~ $ sudo cat /var/spool/cron/crontabs/pi
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.A1BtAB/crontab installed on Thu Feb 2 19:58:10 2023)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
* * * * * /home/pi/scripts/test.bash

Syntaxe crontab

La syntaxe crontab consiste en une série de 5 blocs de caractères, chacun suivi par un espace, qui précise le moment où une tâche doit être lancée.

Il existe des petits utilitaires pour vous aider à définir ce moment, par exemple https://crontab.guru/.

Avec un peu de pratique, vous pourrez entrer vous même la chaîne crontab.

Dans une chaîne crontab, chacun des blocs représente, dans l'ordre :

  • minute
  • heure
  • jour-du-mois
  • mois
  • jour-de-la-semaine (0 = dimanche)

On fait suivre ensuite la commande à exécuter.

Pour chaque bloc, il est possible d'entrer :

  • une valeur numérique valide (ex : 0 en 5e position indique dimanche)

  • une liste de valeurs séparées par des virgules (ex : 10,15 en 2e position signifie à 10h et à 15h)

  • une étendue consistant à deux valeurs séparées par un trait d'union (ex : 0-30 en première position signifie à l'heure juste, à l'heure et une minute, et deux minutes... et 30 minutes).

  • un astérisque (ex : * en 3e position signifie à n'importe quel jour du mois)

Voici quelques exemples pratiques.

* * * * * : à toutes les minutes (n'importe quelle minute, n'importe quelle heure, n'importe quel jour du mois, etc.)

0 * * * * : à toutes les heures

15 * * * * : à toutes les fois qu'on est 15 minutes passé l'heure. Donc, à 1h15, 2h15, 3h15, etc.

0 10 1 * * : à tous les premiers du mois à 10h00

30 17 * * 0 : à tous les dimanches à 17h30

59 23 24 12 * : à tous les 24 décembre à 23h59

0 17 * * 5 : à tous les vendredis à 17h00

0,30 15 * * * : à tous les jours à 15h00 et à 15h30

0-30 15 * * * : à tous les jours à 15h00, 15h01, 15h02, ... 15h30

0 8 * * 1-3 : à 8h00 les lundis, mardis et mercredis

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre