Crontab et planification

Les daemons Cron et Anacron servent à planifier l’exécution de tâches récurrentes à un certain moment : une heure exacte, un jour du mois, un jour de la semaine et par une semaine.

Cron

La commande crontab permet de gérer et de planifier des tâches. Pour exécuter des tâches récurentes, il est conseillé de les faire à partir d’un compte système plutôt qu’utilisateur.

Le fichier /etc/crontab donne la syntaxe et il est possible de spécifier l’utilisateur :

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

Anacron

Le daemon Anacron permet d’éxécuter une tâche prévue si le système est éteint. La tâche prévue pourra être lancée dès que le système sera de nouveau opérationnel.
La commande run-parts permet d’éxécuter les tâches récurentes à partir du fichier /etc/anacrontab.

Syntaxe de /etc/anacrontab :

  • Period in days : intervalle en jours pour exécuter la tâche
  • Delay in minutes : combien de temps le daemon crond doit attendre avant de démarrer la tâche
  • Job identifier : identifiant de la tâche dans les logs
  • Command : commande à exécuter

Exemple :

# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
HOME=/root
LOGNAME=root

# These replace cron's entries
1 5 cron.daily /bin/sh /home/john/checkup.sh
7 10 cron.weekly /bin/sh /home/john/moveFiles.sh
@monthly 15 cron.monthly nice run-parts --report /etc/cron.monthly
7 15 test.daily /bin/sh /home/john/backup.sh

Minuteur systemd

Les timers (minuteurs)

  • sont des fichiers d’unité systemd dont le nom se termine par .timer et qui contrôlent des fichiers ou des événements .service.
  • peuvent être utilisés comme une alternative à cron et peuvent être exécutés de façon asynchrone.

Fichier /usr/lib/systemd/system/stat-collect.timer, l’unité OnCalendar=*:00/10 active stat-collect.service toutes les 10 minutes :

[Unit]
Description=Run system activity accounting tool every 10 minutes

[Timer]
OnCalendar=*:00/10

[Install]
WantedBy=sysstat.service

Après avoir modifié le fichier de configuration il faut recharger la configuration et activer l’unité :

# systemctl daemon-reload
# systemctl enable --now <unitname>.timer

/!\ Résumé des commandes

Commandes :

# crontab -l        // Liste les tâches de l’utilisateur actuel
# crontab -r // Supprime toutes les tâches de l’utilisateur actuel
# crontab -e // Modifie les tâches de l’utilisateur actuel
# crontab <file> // Supprime toutes les tâches et les remplace par les tâches lues dans un fichier

# crontab -u <username> [OPTION] // selectionne la crontab d'un autre utilisateur

# run-parts // permet d'éxécuter les tâches récurentes à partir du fichier

// Minuteur systemd
# systemctl daemon-reload
# systemctl enable --now <unitname>.timer

Fichiers :

/etc/crontab
/etc/cron.d/
/etc/cron.hourly/
/etc/cron.daily/
/etc/cron.weekly/
/etc/cron.monthly/

/etc/anacrontab
/var/spool/anacron/ // liste des tâches Anacron

/usr/lib/systemd/system/<unité_Name>.timer // Minuteur systemd

Cas Pratiques

Crontab utilisateur

Afficahe de la date et de l’heure actuelle :

[aline@SERVER01~]$ date
Sat Sep 14 09:51:34 AM EDT 2024

Ainsi que des moments dans le temps :

[aline@SERVER01~]$ date -d "last day"
Fri Sep 13 09:52:59 AM EDT 2024
[aline@SERVER01~]$ date -d "next month"
Mon Oct 14 09:53:24 AM EDT 2024

[aline@SERVER01~]$ date -d "last day" +%a
Fri
[aline@SERVER01~]$ date -d "last day" +%w
5
[aline@SERVER01~]$ date +%w
6

Ouverture de la crontab et modification, 5-7 correspond à Friday-Sunday :

[aline@SERVER01~]$ crontab -e
*/2 * * * 5-7 /usr/bin/date >> /home/aline/output_date.txt

Lister les tâches :

[aline@SERVER01~]$ crontab -l
*/2 * * * 5-7 /usr/bin/date >> /home/aline/output_date.txt

Ouverture du fichier après quelques secondes :

[aline@SERVER01~]$ cat output_date.txt
Sat Sep 14 16:32:50 AM EDT 2024
Sat Sep 14 16:32:52 AM EDT 2024
Sat Sep 14 16:32:54 AM EDT 2024
Sat Sep 14 16:32:56 AM EDT 2024
Sat Sep 14 16:32:58 AM EDT 2024
Sat Sep 14 16:33:00 AM EDT 2024
Sat Sep 14 16:33:02 AM EDT 2024

Suppression de la crontab :

[aline@SERVER01~]$ crontab -r

Vérification :

[aline@SERVER01~]$ crontab -l
no crontab for aline

Crontab système

Création d’une tâche cron système qui écrit un message indiquant le nombre d’utilisateurs sur le système et l’heure.
Le script /etc/cron.daily/who avec le contenu suivant :

#!/bin/bash

USERCOUNT=$(w -h | wc -l)
DATE=$(date)

logger "${DATE} - There are currently ${USERCOUNT} active users"

Changement de chmod :

[root@SERVER02 ~]# chmod +x /etc/cron.daily/who

Installation du paquet sysstat pour déclencher le service toutes les X min :

[root@SERVER02 ~]# dnf install sysstat
[...]
Is this ok [y/N]: y
[...]
Complete!

Copie du fichier /usr/lib/systemd/system/sysstat-collect.timer dans /etc/systemd/system/sysstat-collect.timer :

[root@SERVER02 ~]# cp /usr/lib/systemd/system/sysstat-collect.timer /etc/systemd/system/sysstat-collect.timer

Modification de /etc/systemd/system/sysstat-collect.timer pour que le minuteur s’exécute toutes les 2min :

[...]
# Activates activity collector every 2 minutes

[Unit]
Description=Run system activity accounting tool every 2 minutes

[Timer]
OnCalendar=*:00/2

[Install]
WantedBy=sysstat.service

Reload le service :

[root@SERVER02 ~]# systemctl daemon-reload

Activer le service :

[root@SERVER02 ~]# systemctl enable --now sysstat-collect.timer
[...]

Le fichier a été créé dans /var/log/sa, la boucle renvoie 0 lorsque le fichier n’existe pas et 1 lorsqu’il existe :

[root@SERVER02 ~]# while [ $(ls /var/log/sa | wc -l) -eq 0 ]; do sleep 1s; done
1

Vérification que le fichier a été modifié dans /var/log/sa :

[root@SERVER02 ~]# ls -l /var/log/sa
total 4
-rw-r--r--. 1 root root 2540 Sep 14 16:45 sa05

[root@SERVER02 ~]# date
Sat Sep 14 10:46:26 AM EDT 2024

Documentation

https://access.redhat.com/documentation/fr-fr/red_hat_enterprise_linux/7/html/system_administrators_guide/ch-automating_system_tasks#s1-autotasks-cron-anacron
http://n0tes.fr/2012/06/29/Cron-et-Crontab/
https://www.thegeekstuff.com/2011/05/anacron-examples/
https://wiki.archlinux.org/title/Systemd_(Fran%C3%A7ais)/Timers_(Fran%C3%A7ais)
MAN crond(8)
MAN crontab(1,5)
MAN anacron(8)
MAN anacrontab(5)
MAN systemd.time(7)
MAN systemd.timer(5)

> Partager <