Systemd Timers vs. Cron : Choisir le bon planificateur
Comparez cron et les minuteurs systemd afin de choisir le bon ordonnanceur Linux pour les tâches simples, les services, la journalisation et les dépendances.
Minuteurs Systemd vs. Cron : Choisir le Bon Ordonnanceur
Lorsque votre serveur Linux doit exécuter une sauvegarde, un nettoyage, une vérification de santé ou un rapport selon un planning, vous choisissez généralement entre cron et les minuteurs systemd. Cron reste simple et portable. Les minuteurs systemd conviennent mieux lorsque la tâche se comporte comme un service géré et nécessite des journaux, des dépendances ou des contrôles de ressources.
Le bon choix dépend de la machine sur laquelle vous exécutez, du comportement de la tâche en cas d'échec et du niveau de visibilité opérationnelle dont vous avez besoin.
Comprendre les Tâches Cron
cron est un ordonnanceur de tâches basé sur le temps dans les systèmes d'exploitation de type Unix. Il permet aux utilisateurs de planifier des commandes ou des scripts pour qu'ils s'exécutent périodiquement à des heures, dates ou intervalles fixes. Le démon cron (crond) s'exécute en arrière-plan et vérifie les fichiers crontab pour toute tâche planifiée.
Comment Fonctionne Cron
Chaque utilisateur peut avoir son propre fichier crontab, géré à l'aide de la commande crontab. Les tâches système sont généralement configurées dans /etc/crontab ou dans des fichiers situés dans /etc/cron.d/.
Une entrée crontab suit un format spécifique :
* * * * * commande_à_exécuter
│ │ │ │ │
│ │ │ │ └───── Jour de la semaine (0 - 6) (Dimanche=0 ou 7)
│ │ │ └─────── Mois (1 - 12)
│ │ └───────── Jour du mois (1 - 31)
│ └─────────── Heure (0 - 23)
└───────────── Minute (0 - 59)
Exemple : Pour exécuter un script de sauvegarde tous les jours à 2h00 du matin :
0 2 * * * /usr/local/bin/backup.sh
Avantages de Cron
- Omniprésent : Disponible sur pratiquement tous les systèmes de type Unix.
- Syntaxe Simple : Le format crontab est relativement facile à apprendre pour une planification de base.
- Tâches Spécifiques à l'Utilisateur : Facile à configurer des tâches pour des utilisateurs individuels.
Inconvénients de Cron
- Flexibilité Limitée : Principalement basé sur des intervalles de temps fixes. La gestion de dépendances complexes ou de planification basée sur des événements est difficile.
- Aucune Gestion des Dépendances : Impossible de définir facilement qu'une tâche ne doit s'exécuter qu'après la réussite d'une autre tâche.
- Aucun Contrôle des Ressources : Offre peu ou pas de contrôle sur les ressources (CPU, mémoire) consommées par les tâches planifiées.
- Journalisation et Surveillance : Repose souvent sur la sortie par courrier, syslog ou une redirection explicite dans la commande.
- Intégration des Fichiers Unit : Pas directement intégré aux capacités de gestion des services de
systemd.
Comprendre les Minuteurs Systemd
Les minuteurs systemd sont un moyen plus avancé et plus flexible de planifier des tâches, en exploitant la puissance des fichiers unit de systemd. Au lieu d'un démon séparé, les minuteurs systemd sont gérés dans le cadre du système d'initialisation systemd lui-même.
Comment Fonctionnent les Minuteurs Systemd
Les minuteurs systemd se composent de deux fichiers unit :
- Unité de Service (
.service) : Définit la tâche ou la commande à exécuter. - Unité de Minuteur (
.timer) : Définit quand l'unité de service correspondante doit être activée.
Ces fichiers sont généralement placés dans /etc/systemd/system/ ou ~/.config/systemd/user/.
Exemple : Planifier un script de nettoyage pour qu'il s'exécute quotidiennement à 3h00 du matin.
Tout d'abord, créez le fichier de service (cleanup.service) :
# /etc/systemd/system/cleanup.service
[Unit]
Description=Tâche de nettoyage quotidienne
[Service]
Type=oneshot
ExecStart=/usr/local/bin/cleanup.sh
Ensuite, créez le fichier minuteur (cleanup.timer) :
# /etc/systemd/system/cleanup.timer
[Unit]
Description=Exécuter la tâche de nettoyage quotidiennement
[Timer]
# Exécuter 25 minutes après le démarrage, puis quotidiennement à 3h00
OnBootSec=25min
OnCalendar=*-*-* 03:00:00
# Alternative : Exécuter 24 heures après la dernière exécution
# OnUnitActiveSec=24h
[Install]
WantedBy=timers.target
Après avoir créé ces fichiers, rechargez systemd, activez le minuteur pour les démarrages futurs et démarrez-le maintenant :
sudo systemctl daemon-reload
sudo systemctl enable cleanup.timer
sudo systemctl start cleanup.timer
Vous pouvez vérifier l'état du minuteur et le moment de sa prochaine activation en utilisant :
sudo systemctl status cleanup.timer
Directives Clés du Minuteur systemd :
OnCalendar=: Spécifie une heure d'événement de calendrier (similaire à la syntaxe de cron mais plus puissante).*-*-* 03:00:00: Quotidiennement à 3h00.Mon..Fri *-*-* 09:00:00: Jours de semaine à 9h00.hourly: Toutes les heures.daily: Une fois par jour.weekly: Une fois par semaine.monthly: Une fois par mois.yearly: Une fois par an.
OnBootSec=: Déclenche un temps spécifié après le démarrage du système.OnUnitActiveSec=: Déclenche un temps spécifié après la dernière activation de l'unité (service) correspondante.OnUnitInactiveSec=: Déclenche un temps spécifié après que l'unité (service) correspondante est devenue inactive.AccuracySec=: La précision requise pour le minuteur. Des valeurs plus faibles peuvent consommer plus d'énergie.Persistent=: Pour les minuteurs calendaires,trueindique à systemd de rattraper le retard si une exécution planifiée a été manquée alors que le minuteur était inactif, par exemple lorsque la machine était éteinte.
Avantages des Minuteurs Systemd
- Intégration avec
systemd: S'intègre parfaitement à la gestion des services, la journalisation (journalctl), le contrôle des ressources et la gestion des dépendances desystemd. - Flexibilité : Prend en charge diverses options de planification au-delà des intervalles fixes, y compris les événements de calendrier, les temps relatifs après le démarrage et les temps relatifs après l'activation précédente.
- Gestion des Dépendances : Peut définir des dépendances sur d'autres unités
systemd(par exemple, la disponibilité du réseau). - Contrôle des Ressources : Peut exploiter les cgroups de
systemdpour la limitation des ressources (CPU, mémoire). - Journalisation : Intégré à
journaldpour une journalisation complète et centralisée. - Gestion des Erreurs : Peut utiliser le comportement des unités de service tel que
Restart=,OnFailure=, et l'ordonnancement des dépendances lorsque ces modèles correspondent à la tâche. - Connaissance de l'État : Peut suivre le moment où une tâche était censée s'exécuter et l'exécuter au démarrage du système si
Persistent=trueest défini.
Inconvénients des Minuteurs Systemd
- Courbe d'Apprentissage Plus Raide : La syntaxe et les concepts des fichiers unit
systemdpeuvent être plus complexes quecronpour les débutants. - Dépendance à Systemd : Nécessite un système exécutant
systemd(la plupart des distributions Linux modernes le font).
Minuteurs Systemd vs. Cron : Principales Différences Résumées
| Fonctionnalité | Tâches Cron | Minuteurs Systemd |
|---|---|---|
| Gestion | Commande crontab, fichiers système |
Commande systemctl, fichiers unit |
| Planification | Minute, heure, jour, mois, jour de semaine fixes | Événements calendaires, temps relatifs, basés sur le démarrage |
| Intégration | Démon autonome | Intégré à systemd |
| Journalisation | Courrier, redirection de script | journald |
| Dépendances | Aucune | Dépendances des unités systemd |
| Contrôle Ressources | Aucun | Cgroups systemd |
| Gestion des Erreurs | Basique | Gestion des échecs des unités de service |
| Suivi d'État | Limité | Option Persistent= |
| Complexité | Plus simple pour les tâches de base | Plus puissant, courbe d'apprentissage plus raide |
Quand Choisir Quel Ordonnanceur
Choisissez Cron Quand :
- Vous êtes sur un système très ancien ou minimal qui n'utilise pas
systemd. - Vous devez planifier une tâche très simple et unique avec un calendrier récurrent fixe, et vous privilégiez la simplicité aux fonctionnalités avancées.
- Vous avez besoin d'une planification rapide pour une commande qui gère déjà sa propre journalisation et ses erreurs.
Choisissez les Minuteurs Systemd Quand :
- Vous êtes sur une distribution Linux moderne qui utilise
systemd. - Vous avez besoin de plus de contrôle sur quand une tâche s'exécute (par exemple, par rapport au démarrage, par rapport à la dernière exécution, après la mise en route du réseau).
- Vous avez besoin d'une meilleure journalisation, surveillance et gestion des erreurs.
- Vous souhaitez gérer l'exécution des tâches avec les puissantes fonctionnalités de gestion des services de
systemd, y compris le contrôle des ressources et la gestion des dépendances. - Vous gérez déjà d'autres services avec
systemdet souhaitez une approche cohérente de la planification. - Vos tâches ont des dépendances vis-à-vis d'autres services ou événements système.
Règle de Base Pratique
Utilisez cron lorsque la tâche est une commande courte et évidente et que la portabilité est importante. Utilisez un minuteur systemd lorsque la tâche fait partie d'un service, nécessite les journaux de journalctl, doit attendre le réseau, ou bénéficie de limites de ressources et d'un ordonnancement des dépendances.
Une sauvegarde nocturne est un bon exemple. Sur un petit serveur legacy, 0 2 * * * /usr/local/bin/backup.sh peut suffire. Sur un hôte de production basé sur systemd, un backup.service plus un backup.timer vous donne un état plus clair, des journaux, un rattrapage au démarrage avec Persistent=true, et un chemin plus propre pour ajouter des dépendances ultérieurement.