Dans cette leçon, tu vas découvrir les minuteurs systemd (systemd timers), une alternative moderne et puissante à cron pour planifier des tâches. Intégrés à systemd, ils offrent plus de fonctionnalités : suivi dans journalctl, activation à chaud, support des événements système, et bien plus.
cron fait le job depuis des décennies. Mais il a ses limites :
cron ou syslog)systemd timers résolvent tout ça :
journalctlUn minuteur systemd fonctionne toujours par paire :
tache.service → Le script/la commande à exécuter tache.timer → Le déclencheur (quand et comment)
sudo nano /etc/systemd/system/ma-tache.service[Unit]
Description=Ma première tâche planifiée
[Service]
Type=oneshot
ExecStart=/home/user/scripts/backup.sh
[Install]
WantedBy=multi-user.targetType=oneshot = le service s'exécute une fois et se termine.
sudo nano /etc/systemd/system/ma-tache.timer[Unit]
Description=Mon minuteur quotidien
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.targetExplications des options :
OnCalendar=daily → s'exécute une fois par jour (à minuit)Persistent=true → rattrape les exécutions manquées si le PC était éteint# Recharger systemd pour voir les nouvelles unités
sudo systemctl daemon-reload
# Activer le minuteur (démarre au boot)
sudo systemctl enable ma-tache.timer
# Démarrer immédiatement
sudo systemctl start ma-tache.timer
# Vérifier que le minuteur est actif
sudo systemctl status ma-tache.timerOnCalendar=daily # Une fois par jour à minuit
OnCalendar=hourly # Toutes les heures
OnCalendar=minutely # Chaque minute
OnCalendar=weekly # Une fois par semaine
OnCalendar=*-*-* 04:00:00 # Chaque jour à 4h du matin
OnCalendar=*-*-01 00:00:00 # Premier du mois à minuit
OnCalendar=Mon *-*-* 09:00:00 # Chaque lundi à 9h
OnCalendar=*-*-25 12:00:00 # Le 25 du mois à midi
OnCalendar=Sat,Sun *-*-* 10:00:00 # Weekends à 10hOnCalendar=*-*-* *:00:00 # Toutes les heures pile
OnCalendar=*-*-* *:00/15:00 # Toutes les 15 minutes
OnCalendar=*-*-03..09 18:00:00 # Du 3 au 9 du mois à 18h
OnCalendar=hourly::00 # Toutes les heures
OnCalendar=*:0/5 # Toutes les 5 minutes# Voir quand un calendrier sera déclenché
systemd-analyze calendar "daily"
systemd-analyze calendar "Mon *-*-* 09:00:00"[Timer]
# Exécute 1h après le démarrage, puis toutes les 24h
OnBootSec=1h
OnUnitActiveSec=24h[Timer]
# Exécute 5 minutes après le démarrage
OnBootSec=5min
# Puis toutes les 12 heures
OnUnitActiveSec=12h# Lister tous les minuteurs
systemctl list-timers --all# Logs du service
sudo journalctl -u ma-tache.service
# Logs du minuteur
sudo journalctl -u ma-tache.timer
# Suivre en temps réel
sudo journalctl -f -u ma-tache.service# Lancer le service maintenant (sans attendre le minuteur)
sudo systemctl start ma-tache.service
# Forcer le minuteur à s'exécuter maintenant
sudo systemctl start ma-tache.timermkdir -p ~/scripts
nano ~/scripts/backup.sh#!/bin/bash
# backup.sh - Backup quotidien du home
DATE=$(date +%Y-%m-%d)
BACKUP_DIR=/home/user/backups
SOURCE=/home/user/documents
mkdir -p "$BACKUP_DIR"
tar -czf "$BACKUP_DIR/backup-$DATE.tar.gz" "$SOURCE"
# Garder que les 7 derniers backups
ls -t "$BACKUP_DIR"/backup-*.tar.gz | tail -n +8 | xargs rm -f 2>/dev/null
echo "$(date) : Backup effectué avec succès" >> /var/log/backup.logchmod +x ~/scripts/backup.shsudo nano /etc/systemd/system/backup.service[Unit]
Description=Backup quotidien du répertoire documents
After=network.target
[Service]
Type=oneshot
ExecStart=/home/user/scripts/backup.sh
User=user
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.targetsudo nano /etc/systemd/system/backup.timer[Unit]
Description=Minuteur de backup quotidien
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
RandomizedDelaySec=30min
[Install]
WantedBy=timers.targetRandomizedDelaySec=30min = ajoute un délai aléatoire jusqu'à 30 min pour éviter que tous les minuteurs s'exécutent en même temps.
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer[Unit]
Description=Monitor de surveillance
[Service]
Type=notify
ExecStart=/home/user/scripts/monitor.sh
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target[Unit]
Description=Mission critique
[Timer]
# S'exécute toutes les 6h
OnUnitActiveSec=6h
# Ne s'exécute PAS si sur batterie (laptop)
ConditionACPower=true
# Décalage aléatoire max 5 min pour éviter les conflits
RandomizedDelaySec=5min
[Install]
WantedBy=timers.target| Fonctionnalité | cron | systemd timers |
|---|---|---|
| Configuration | crontab -e |
Fichiers .service + .timer dans /etc/systemd/system/ |
| Logs | Fichier externe (cron, syslog) | journalctl -u unit |
| Reprise après veille | ❌ | ✅ (avec Persistent=true) |
| Décalage aléatoire | ❌ | ✅ (RandomizedDelaySec) |
| Débogage | Difficile | Facile (systemctl status) |
| Dépendances | Manuelles (dans le script) | Via directives [Unit] |
| Activation par événement | ❌ | ✅ (via OnCalendar + OnBootSec) |
# Recharger après modification
sudo systemctl daemon-reload
# Activer (au démarrage)
sudo systemctl enable unit.timer
# Démarrer maintenant
sudo systemctl start unit.timer
# Arrêter
sudo systemctl stop unit.timer
# Désactiver
sudo systemctl disable unit.timer
# Voir le statut
systemctl status unit.timer
# Lister les minuteurs actifs
systemctl list-timers --all
# Voir les prochaines exécutions
systemctl list-timers --all --no-pager
# Logs
journalctl -u unit.service
journalctl -u unit.timer -f
# Tester le service seul
sudo systemctl start unit.service
# Vérifier la validité d'un calendrier
systemd-analyze calendar "*-*-* 03:00:00"Objectif : Créer un minuteur qui affiche un message dans les logs toutes les 5 minutes.
Étape 1 : Crée le script
mkdir -p ~/scripts
nano ~/scripts/log-message.sh#!/bin/bash
echo "$(date) : Le minuteur fonctionne ! ID du système : $(hostname)"chmod +x ~/scripts/log-message.shÉtape 2 : Crée le service
sudo nano /etc/systemd/system/log-message.service[Unit]
Description=Message de test pour minuteur systemd
[Service]
Type=oneshot
ExecStart=/home/user/scripts/log-message.sh
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.targetÉtape 3 : Crée le minuteur (toutes les 5 minutes)
sudo nano /etc/systemd/system/log-message.timer[Unit]
Description=Minuteur de test - toutes les 5 minutes
[Timer]
OnCalendar=*:0/5
Persistent=true
[Install]
WantedBy=timers.targetÉtape 4 : Active et vérifie
sudo systemctl daemon-reload
sudo systemctl enable --now log-message.timer
sudo systemctl status log-message.timerÉtape 5 : Vérifie les logs
journalctl -u log-message.service -f
# (attends 5 minutes ou force l'exécution)
sudo systemctl start log-message.service
journalctl -u log-message.service --no-pagerÉtape 6 : Nettoie (une fois l'exercice terminé)
sudo systemctl stop log-message.timer
sudo systemctl disable log-message.timer
sudo rm /etc/systemd/system/log-message.timer
sudo rm /etc/systemd/system/log-message.service
sudo systemctl daemon-reload✅ Tu sais maintenant créer et gérer des minuteurs systemd !
| Concept | Description |
|---|---|
.service |
Définit la commande à exécuter (ExecStart) |
.timer |
Définit QUAND exécuter (OnCalendar, OnBootSec) |
OnCalendar |
Planification par calendrier (daily, hourly, date précise) |
OnBootSec / OnUnitActiveSec |
Planification par intervalle depuis boot/dernière exécution |
Persistent=true |
Rattrape les exécutions manquées |
RandomizedDelaySec |
Décalage aléatoire pour espacer les tâches |
systemctl list-timers |
Voir tous les minuteurs et prochaines exécutions |
journalctl -u unit |
Voir les logs d'un service |
La règle d'or : Si tu utilises déjà cron, les minuteurs systemd valent le détour pour les tâches critiques ou sur laptop (veille/hibernation). Pour les tâches simples, cron reste très bien.