Objectifs
- Comprendre ce que sont les timers
systemdet pourquoi ils sont une alternative moderne àcron. - Créer une unité
.servicepour définir la tâche à exécuter. - Créer une unité
.timerpour définir la planification. - Activer et gérer les timers avec la commande
systemctl. - Consulter les journaux d’exécution avec
journalctl.
Explications détaillées
Notions clés
systemd : Plus qu’un simple planificateur
systemd est le gestionnaire de système et de services utilisé par la majorité des distributions Linux modernes (Debian, Ubuntu, CentOS, Fedora…). Il est responsable du démarrage du système, de la gestion des services, et bien plus encore. Les “timers” sont la manière dont systemd gère les tâches planifiées.
Avantages des timers systemd sur cron
- Journalisation intégrée : Toute la sortie (standard et erreur) de votre tâche est automatiquement capturée par
journalctl. Finis les emails ou les redirections manuelles. - Gestion fine de l’environnement : Vous pouvez spécifier l’utilisateur, le groupe, le répertoire de travail, et les variables d’environnement directement dans le fichier de service.
- Dépendances : Un timer peut être configuré pour ne se lancer qu’après un autre service (ex: après que le réseau soit actif).
- Sécurité accrue :
systemdpermet d’isoler les processus (“sandboxing”) en limitant leurs accès au système de fichiers ou au réseau.
Les deux fichiers : .service et .timer
Une tâche planifiée avec systemd est définie par une paire de fichiers, qui doivent porter le même nom (ex: mon_job.service et mon_job.timer).
-
Le fichier
.service: Il décrit quoi faire. C’est une définition de service classique.[Unit]: Métadonnées comme la description.[Service]: La commande à exécuter (ExecStart).
-
Le fichier
.timer: Il décrit quand le faire.[Unit]: Doit contenir une référence au service à lancer (Unit=mon_job.service).[Timer]: La planification.OnCalendar=est la directive la plus courante.[Install]: Indique àsystemdquand démarrer ce timer (généralement au démarrage du système).
Les fichiers d’unité pour les services système se placent dans /etc/systemd/system/.
Syntaxe / Usages
Exemple de fichier .service : /etc/systemd/system/backup.service
[Unit]
Description=Exécute le script de sauvegarde personnel
[Service]
Type=oneshot
ExecStart=/usr/local/bin/mon_script_de_backup.sh
User=admin
Type=oneshot: Indique que c’est un processus qui s’exécute une fois et se termine.
Exemple de fichier .timer : /etc/systemd/system/backup.timer
[Unit]
Description=Lance le script de sauvegarde tous les jours à 2h
# Le timer déclenche le service du même nom
Requires=backup.service
[Timer]
# Syntaxe très flexible pour définir le calendrier
OnCalendar=daily 02:00
# On peut aussi utiliser : *-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
OnCalendar: Accepte des formats variés (hourly,daily,weekly, ou une expression détaillée).Persistent=true: Si la machine était éteinte à 2h, la tâche s’exécutera dès le prochain démarrage.
Commandes systemctl
Après avoir créé ou modifié ces fichiers, il faut interagir avec systemd.
# Recharger la configuration de systemd (après chaque modification de fichier)
sudo systemctl daemon-reload
# Activer le timer pour qu'il démarre avec le système
sudo systemctl enable backup.timer
# Démarrer le timer immédiatement
sudo systemctl start backup.timer
# Lister tous les timers actifs et voir leur prochaine exécution
systemctl list-timers
# Voir les logs d'exécution du service
journalctl -u backup.service
Bonnes pratiques
- Pour les tâches système sur des serveurs Linux modernes, préférez les timers
systemdàcron. C’est plus robuste et plus facile à déboguer. - Utilisez les timers “utilisateur” (
--user) pour les tâches qui ne nécessitent pas de privilègesroot. Les fichiers se placent alors dans~/.config/systemd/user/. - Utilisez
journalctlpour inspecter la sortie de vos scripts.journalctl -u mon_job.service -fvous montrera les logs en temps réel.
Pièges courants
- Oublier
daemon-reload: Si vous modifiez un fichier.serviceou.timer,systemdn’en sera pas informé tant que vous n’aurez pas exécutésudo systemctl daemon-reload. - Erreurs de syntaxe dans
OnCalendar: La syntaxe est puissante mais peut être déroutante. Utilisezsystemd-analyze calendarpour la valider. - Problèmes de permissions : Assurez-vous que l’utilisateur spécifié dans le fichier
.service(User=...) a bien le droit d’exécuter le script et d’accéder aux fichiers nécessaires.
Exercices
-
Votre premier timer :
- Créez un fichier
/etc/systemd/system/hello.servicequi exécute la commande/bin/echo "Hello depuis systemd". - Créez le fichier
/etc/systemd/system/hello.timerassocié qui se déclenche toutes les minutes (OnCalendar=*:0/1). - Rechargez, activez et démarrez le timer.
- Utilisez
systemctl list-timerspour voir quand il s’exécutera. - Utilisez
journalctl -u hello.servicepour voir sa sortie.
- Créez un fichier
-
Nettoyage :
- Une fois que vous avez vu le message apparaître plusieurs fois, arrêtez et désactivez le timer.
sudo systemctl stop hello.timersudo systemctl disable hello.timer- Supprimez les deux fichiers que vous avez créés.
- N’oubliez pas de faire
sudo systemctl daemon-reloadaprès la suppression.