Tâches planifiées

at, cron et systemd sont les programme Linux natifs qui permettent de planifier des tâches.

1. Commande at

at est une commande Unix qui permet de programmer des commandes à n’exécuter qu’une fois – par opposition à cron — à un moment donné. La commande enregistrée hérite de l’environnement courant utilisé au moment de sa définition. Par exemple, pour une exécution de la commande à 05:45 :

echo "touch file.txt" | at 0545

at dipose d’options telles que :

  • at -l ou atq : affiche la liste des jobs introduits par la commande “at”.
  • at -r <JOB> ou atrm <JOB> : efface le job identifié par son numéro de job.
  • at : sans paramètre, donne la ligne “Garbled time”.

1.1. créer une tâche planifiée

Voici une procédure courante pour créer un job avec at.

Vérifier le moment :

date
dim jun  6 11:58:42 CEST 2021

Créer une tâche pour 12h00 :

at 1200
at> echo $(date) >> now.txt
at> <CTRL-D>
job 1 at Sun Jun  6 12:00:00 2021

Vérifier la programmation :

at -l
1	Mon Jun  7 12:00:00 2021 a francois

Vérification :

date; ls -l now.txt; cat now.txt
dim jun  6 12:01:17 CEST 2021
-rw-rw-r-- 1 francois francois 29  6 jun 12:00 now.txt
dim jun 6 12:00:00 CEST 2021

1.2. supprimer une tâche planifiée

Vérification de la tâche :

atq
1	Mon Jun  7 12:00:00 2021 a francois

Suppression de la tâche :

atrm 1

Nouvelle vérification de la tâche :

atq

2. Cron

Le logiciel utilitaire ‘Cron’ est un planificateur de tâches basé sur le temps dans les systèmes de type Unix. On utilise cron pour planifier des tâches (commandes ou les scripts shell) pour les exécuter périodiquement à des heures fixes, à des dates ou dans des intervalles. Le nom “cron” vient du mot grec pour le temps, χρόνος (chronos).

cron.d est normalement lancé comme service.

Le programme crontab permet aux utilisateurs de gérer leurs tâches.

2.1. Répertoire /etc/cron*

Placer un script dans l’un de ses répertoires l’exécute à un moment prédéfini :

ls /etc/cron*
/etc/cron.deny  /etc/crontab
/etc/cron.d:
0hourly  raid-check  sysstat  unbound-anchor
/etc/cron.daily:
0yum-daily.cron  logrotate  man-db.cron  mlocate
/etc/cron.hourly:
0anacron  0yum-hourly.cron
/etc/cron.monthly:
/etc/cron.weekly:

2.2. Service cron

Sous Centos 7, on trouvera un service crond.service :

sudo systemctl status crond.service
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since sam 2021-06-05 12:32:45 CEST; 23h ago
 Main PID: 1062 (crond)
    Tasks: 1
   CGroup: /system.slice/crond.service
           └─1062 /usr/sbin/crond -n

2.3. Fichier /etc/crontab

Le fichier /etc/crontab nous indique la structure d’une commande plannifiée.

cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
# |  |  |  |  |     OR sun,mon,tue,wed,thu,fri,sat
# *  *  *  *  * user-name  command-to-be-executed

2.4. Commande crontab

Pour gérer son gestionnaire des tâches planifiées, on lance la commande crontab -e qui utilise l’éditeur par défaut :

crontab -e
et insérer ceci pour lancer un script à chaque minute :
# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
# |  |  |  |  |     OR sun,mon,tue,wed,thu,fri,sat
# *  *  *  *  * user-name  command to be executed
* * * * * /home/francois/job1.sh

Vérifier les jobs programmés :

crontab -l

Créer un script du type :

#!/bin/bash
# job1.sh
touch /home/francois/cron-$(date +"%Y%H%M")
exit

Vérifier avec :

ls -l ~/cron*

2.5. Champs dates et heures

Champsvaleurs autorisées
minute0-59
hour0-23
day of month1-31
month1-12 (ou les noms en anglais)
day of week0-7 (0 or 7 est aussi dimanche ou les noms des jours)

Les trois premières lettres des noms des mois et des jours de la semaine correspondent aux termes anglais quelle que soit la casse.

2.6. Valeurs numériques

On peut écrire des plages de valeurs (inclusif) :

8-11

On peut écrire des listes de plages :

1,2,5,9

ou

0-4,8-12

Une valeur suivie de “/<nombre>” correspond à une cadence. Cet exemple correspond à une cadence tous les 2 de 0 à 23 (on suppose un exemple sur l’heure) :

0-23/2

L’alternative aurait été :

0,2,4,6,8,10,12,14,16,18,20,22

S’il s’agit d’une cadence de “tous les deux” temps, il est peut-être plus évident d’écrire ceci :

*/2

2.7. Exemples de planification

Chaque jour, 5 minutes après minuit :

5 0 * * *

Le premier jour de chaque mois à 14h15 :

15 14 1 * *

Du lundi au vendredi à 22h :

0 22 * * 1-5

Chaque jour, toutes les deux heures à partir de minuit :

23 0-23/2 * * *

Chaque dimanche à 4h05 :

5 4 * * sun

3. Compteurs systemd

Systemd vous permet de définir des compteurs. Cette fonctionnalité est destinée à fonctionner avec des services mais peut être utilisée pour tout autre chose. Il s’agit d’une alternative puissante à cron.1