Planifier des tâches avec at, cron et les timers systemd

LinuxBeginner
Pratiquer maintenant

Introduction

Les administrateurs Linux disposent de plusieurs méthodes pour planifier des tâches. La commande at permet de planifier des tâches ponctuelles, cron gère les tâches récurrentes à partir de champs temporels simples, et les timers systemd permettent de planifier des services systemd en s'appuyant sur le modèle de dépendances et de journalisation de systemd.

Dans ce laboratoire, vous allez créer un script de commande et le planifier de trois manières différentes. Vous inspecterez les services de planification, mettrez en file d'attente une tâche at ponctuelle, configurerez un fichier de configuration cron (drop-in), créerez un couple service/timer systemd, et testerez manuellement le service associé au timer.

Inspecter les planificateurs et créer un script de tâche

Dans cette étape, vous allez vérifier que les services de planification sont en cours d'exécution et créer un petit script que toutes les tâches planifiées appelleront.

Accédez au répertoire du projet.

cd /home/labex/project

Vérifiez le démon de tâches ponctuelles et le démon cron. systemctl is-active affiche active lorsqu'un service est en cours d'exécution.

systemctl is-active atd crond

Listez les timers systemd existants. La sortie affiche l'heure de la prochaine exécution, l'unité de timer et l'unité de service qu'elle active.

systemctl list-timers --all --no-pager | sed -n '1,10p'

Créez un script qui ajoute une ligne horodatée à un fichier journal. Le premier argument, $1, devient l'étiquette qui identifie quel planificateur a exécuté le script.

cat > /home/labex/project/scheduled-note.sh <<'EOF'
#!/bin/bash
echo "$(date '+%F %T') $1" >> /home/labex/project/schedule-events.log
EOF

Rendez le script exécutable.

chmod 755 /home/labex/project/scheduled-note.sh

Exécutez le script manuellement une fois.

/home/labex/project/scheduled-note.sh manual-run
tail -n 1 /home/labex/project/schedule-events.log

La ligne du journal doit se terminer par manual-run.

Mettre en file d'attente une tâche at ponctuelle

Dans cette étape, vous allez planifier une tâche unique avec at. C'est utile pour les opérations qui ne doivent se produire qu'une seule fois à un moment futur, comme une tâche de maintenance temporaire.

Mettez le script en file d'attente pour une exécution dans deux heures. La commande à exécuter est transmise via un tube (pipe) à at.

echo "/home/labex/project/scheduled-note.sh at-job" | at now + 2 hours

Listez les tâches en attente.

atq

Enregistrez l'identifiant de la tâche (job id) à partir de la première ligne de atq. L'identifiant est le premier champ de la sortie.

job_id="$(atq | awk 'NR==1 {print $1}')"
echo "$job_id" > /home/labex/project/at-job.id
cat /home/labex/project/at-job.id

Inspectez le contenu de la tâche en attente. at -c affiche le script généré ; les dernières lignes doivent inclure la commande que vous avez planifiée.

at -c "$job_id" | tail -n 12

Configurer un fichier cron drop-in

Dans cette étape, vous allez configurer une tâche cron récurrente à l'aide d'un fichier dans /etc/cron.d. Les fichiers de ce répertoire incluent un champ utilisateur, permettant au système de savoir quel compte doit exécuter la commande.

Créez un fichier cron qui exécute le script chaque minute en tant qu'utilisateur labex. La ligne PATH fournit à cron un chemin de recherche de commandes prévisible.

sudo tee /etc/cron.d/rhcsa-schedule-demo >/dev/null <<'EOF'
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
* * * * * labex /home/labex/project/scheduled-note.sh cron-job
EOF

Définissez les permissions du fichier sur 644. Les fichiers cron doivent être lisibles et ne doivent pas être modifiables par des utilisateurs ordinaires.

sudo chmod 644 /etc/cron.d/rhcsa-schedule-demo

Rechargez crond pour qu'il prenne en compte le fichier immédiatement.

sudo systemctl reload crond

Inspectez le fichier que vous avez créé.

sudo cat /etc/cron.d/rhcsa-schedule-demo

Les champs de planification * * * * * signifient "chaque minute".

Créer un service et un timer systemd

Dans cette étape, vous allez créer un service systemd et un timer qui l'active. Un timer n'exécute pas de commande directement ; il démarre une unité de service.

Les services système doivent exécuter des commandes à partir des chemins exécutables du système, et non à partir du répertoire de travail d'un utilisateur. Installez une copie de votre script dans /usr/local/bin.

sudo install -m 755 /home/labex/project/scheduled-note.sh /usr/local/bin/rhcsa-scheduled-note
sudo restorecon /usr/local/bin/rhcsa-scheduled-note 2>/dev/null || true
ls -l /usr/local/bin/rhcsa-scheduled-note

Créez l'unité de service. Type=oneshot est approprié pour une commande qui s'exécute puis se termine.

sudo tee /etc/systemd/system/rhcsa-schedule-demo.service >/dev/null <<'EOF'
[Unit]
Description=Write RHCSA schedule demo entry

[Service]
Type=oneshot
User=labex
ExecStart=/usr/local/bin/rhcsa-scheduled-note timer-job
EOF

Créez l'unité de timer. OnBootSec=2min planifie une première exécution après le démarrage, et OnUnitActiveSec=5min planifie les exécutions ultérieures par rapport à l'activation précédente.

sudo tee /etc/systemd/system/rhcsa-schedule-demo.timer >/dev/null <<'EOF'
[Unit]
Description=Run RHCSA schedule demo periodically

[Timer]
OnBootSec=2min
OnUnitActiveSec=5min
Unit=rhcsa-schedule-demo.service

[Install]
WantedBy=timers.target
EOF

Rechargez systemd, activez le timer pour le démarrage, puis démarrez-le immédiatement. Séparer enable et start permet de distinguer clairement quelle commande rend le timer persistant et laquelle l'active immédiatement.

sudo systemctl daemon-reload
sudo systemctl enable rhcsa-schedule-demo.timer
sudo systemctl start rhcsa-schedule-demo.timer

Inspectez le timer.

systemctl list-timers rhcsa-schedule-demo.timer --all --no-pager

Le timer doit apparaître dans la liste et activer rhcsa-schedule-demo.service.

Tester le service du timer et supprimer la tâche at

Dans cette étape, vous allez démarrer manuellement le service utilisé par le timer. Cela permet de vérifier la commande immédiatement sans attendre la prochaine activation planifiée. Vous supprimerez également la tâche at en attente, car elle n'était destinée qu'à l'exercice.

Démarrez le service manuellement.

sudo systemctl start rhcsa-schedule-demo.service

Inspectez le journal.

tail -n 5 /home/labex/project/schedule-events.log

Une ligne doit se terminer par timer-job.

Supprimez la tâche at en attente en utilisant l'identifiant enregistré précédemment.

job_id="$(cat /home/labex/project/at-job.id)"
atrm "$job_id"

Confirmez que la tâche n'est plus dans la file d'attente.

atq

Résumé

Vous avez pratiqué trois méthodes de planification. Vous avez inspecté atd, crond et les timers systemd, créé un script de commande planifiable réutilisable, mis en file d'attente et inspecté une tâche at ponctuelle, configuré un fichier cron récurrent, installé une commande sécurisée dans /usr/local/bin, créé un couple service/timer systemd, testé manuellement le service du timer et supprimé la tâche at temporaire.