Bienvenue dans le monde merveilleux des tâches planifiées sous Debian.
Ici, les scripts travaillent pendant que vous dormez, les sauvegardes se déclenchent sans demander la permission et une simple étoile placée au mauvais endroit peut transformer une opération mensuelle en événement se produisant toutes les minutes.
Le principe est pourtant très sain : faire exécuter automatiquement une commande à un moment donné.
Pour cela, deux outils historiques restent particulièrement utiles :
- cron, pour les tâches récurrentes ;
- at, pour les tâches ponctuelles à exécuter plus tard.
Et puisque Debian vit désormais très confortablement avec systemd, nous verrons également pourquoi les timers systemd méritent parfois de prendre la relève.
La règle fondamentale :
cron répond à « fais ceci régulièrement ».
at répond à « fais ceci une fois, plus tard ».
systemd timers répondent à « faisons la même chose, mais avec davantage de fichiers de configuration ».
Cron : le démon qui ne dort jamais
cron est un service qui tourne en arrière-plan et examine régulièrement les tâches qui lui ont été confiées.
Lorsque la date et l’heure correspondent à une règle définie dans une crontab, cron exécute la commande associée.
Il ne réfléchit pas à l’opportunité de l’action.
Si vous lui demandez de supprimer un répertoire chaque matin à 3 h 12, il ne vous demandera pas si vous êtes certain. Cron n’est pas votre mère. Cron respecte le planning.
Vérifier que cron fonctionne
Sur un système Debian utilisant le service cron classique :
systemctl status cron
Pour le démarrer :
sudo systemctl start cron
Et pour s’assurer qu’il démarre avec le système :
sudo systemctl enable cron
Sur une installation Debian minimale ou particulière, le paquet peut ne pas être présent. Dans ce cas :
sudo apt install cron
La syntaxe d’une crontab
Dans la crontab personnelle d’un utilisateur, une tâche classique possède cette forme :
* * * * * /chemin/vers/commande
Les cinq champs temporels sont, dans l’ordre :
| Position | Champ | Valeurs courantes |
|---|---|---|
| 1 | Minute | 0–59 |
| 2 | Heure | 0–23 |
| 3 | Jour du mois | 1–31 |
| 4 | Mois | 1–12 |
| 5 | Jour de la semaine | 0–7, dimanche étant 0 ou 7 |
Puis vient la commande à exécuter.
Une étoile signifie :
« Toutes les valeurs possibles pour ce champ. »
Ainsi :
* * * * * /usr/local/bin/script.sh
signifie :
exécuter le script toutes les minutes.
Oui. Toutes.
C’est généralement à ce moment précis que l’on découvre l’importance de relire avant d’enregistrer.
Quelques exemples utiles
Tous les jours à 2 h 30
30 2 * * * /usr/local/bin/backup.sh
Toutes les heures
0 * * * * /usr/local/bin/script.sh
Toutes les cinq minutes
*/5 * * * * /usr/local/bin/check.sh
Chaque lundi à 8 h
0 8 * * 1 /usr/local/bin/report.sh
Le premier jour de chaque mois à minuit
0 0 1 * * /usr/local/bin/monthly.sh
Du lundi au vendredi à 18 h 15
15 18 * * 1-5 /usr/local/bin/cleanup.sh
À 6 h et 18 h chaque jour
0 6,18 * * * /usr/local/bin/sync.sh
Les champs acceptent donc notamment :
- l’étoile :
*; - les listes :
1,3,5; - les plages :
1-5; - les pas :
*/10; - et certaines combinaisons de ces syntaxes.
Le piège du jour du mois et du jour de la semaine
Cron possède une subtilité suffisamment contre-intuitive pour mériter sa propre section.
Considérez :
0 9 1 * 1 /usr/local/bin/script.sh
On pourrait croire que cela signifie :
« À 9 h, lorsque nous sommes à la fois le premier jour du mois et un lundi. »
Ce n’est pas le comportement du cron classique.
Lorsque le jour du mois et le jour de la semaine sont tous les deux restreints, la tâche est exécutée si l’un ou l’autre correspond.
Cette ligne signifie donc en pratique :
- à 9 h tous les premiers du mois ;
- et à 9 h tous les lundis.
C’est une logique OU, pas une logique ET.
Une petite délicatesse historique dont on apprécie pleinement la poésie après avoir lancé un traitement beaucoup plus souvent que prévu.
Les raccourcis pratiques
Cron accepte également plusieurs expressions spéciales qui évitent de sortir les cinq colonnes pour les cas courants.
| Expression | Signification |
|---|---|
@reboot |
Au démarrage du service cron |
@hourly |
Une fois par heure |
@daily |
Une fois par jour |
@midnight |
Équivalent à @daily |
@weekly |
Une fois par semaine |
@monthly |
Une fois par mois |
@yearly |
Une fois par an |
@annually |
Équivalent à @yearly |
Par exemple :
@reboot /usr/local/bin/start-my-thing.sh
Attention toutefois : @reboot signifie que la tâche est lancée lorsque cron démarre. Certains autres services dont votre script dépend peuvent ne pas encore être complètement opérationnels.
Le démarrage d’une machine reste cette période charmante où tout le monde se lève en même temps et prétend être prêt.
Gérer sa crontab
Chaque utilisateur peut posséder sa propre crontab.
Éditer sa crontab
crontab -e
L’afficher
crontab -l
La supprimer entièrement
crontab -r
Cette dernière commande mérite un instant de respect.
Elle ne supprime pas « la ligne qui vous gêne ».
Elle supprime la crontab entière de l’utilisateur.
Pour éviter certains regrets, Debian propose également :
crontab -i -r
qui demande une confirmation avant la suppression.
Administrer la crontab d’un autre utilisateur
Avec les privilèges nécessaires :
sudo crontab -u alice -e
Et pour la consulter :
sudo crontab -u alice -l
Crontab utilisateur et crontab système : attention au champ supplémentaire
Une crontab utilisateur possède :
minute heure jour mois semaine commande
Mais /etc/crontab et les fichiers placés dans /etc/cron.d/ ajoutent un champ indiquant l’utilisateur sous lequel la commande doit être exécutée.
La syntaxe devient alors :
minute heure jour mois semaine utilisateur commande
Par exemple :
30 2 * * * root /usr/local/sbin/backup.sh
C’est important.
Copier directement cette ligne dans la crontab personnelle de root laisserait le mot root au début de la commande.
Cron essaierait alors d’exécuter un programme appelé root.
Il échouerait.
Et quelque part, un administrateur commencerait à soupçonner SELinux alors que SELinux n’est même pas installé.
Les emplacements système sous Debian
Debian utilise plusieurs emplacements traditionnels pour les tâches périodiques.
| Emplacement | Utilisation |
|---|---|
/etc/crontab |
Crontab générale du système |
/etc/cron.d/ |
Fichiers cron séparés, notamment utilisés par les paquets |
/etc/cron.hourly/ |
Scripts périodiques horaires |
/etc/cron.daily/ |
Scripts quotidiens |
/etc/cron.weekly/ |
Scripts hebdomadaires |
/etc/cron.monthly/ |
Scripts mensuels |
Sur une installation Debian classique, ces répertoires sont notamment traités à l’aide de run-parts.
Le piège du nom de fichier dans cron.daily
run-parts applique des règles sur les noms des fichiers qu’il exécute.
Avec son comportement Debian classique, un nom contenant un point peut par exemple être ignoré.
Ainsi :
/etc/cron.daily/backup
est un bon nom.
Alors que :
/etc/cron.daily/backup.sh
peut ne pas être sélectionné par run-parts avec ses règles par défaut.
Le script est là. Il est exécutable. Vous le regardez depuis quarante minutes.
Mais son extension .sh lui a valu une condamnation administrative sans procès.
Pour voir ce que run-parts considère comme exécutable :
run-parts --test /etc/cron.daily
Les permissions comptent
Un script planifié doit évidemment être accessible et exécutable par l’utilisateur qui lance la tâche.
Par exemple :
sudo chmod 750 /usr/local/sbin/backup.sh
Mais la sécurité ne se limite pas au bit d’exécution.
Un script lancé par root ne doit pas être modifiable par n’importe quel utilisateur.
Imaginez :
0 2 * * * root /opt/scripts/backup.sh
Si backup.sh est modifiable par un utilisateur non privilégié, celui-ci dispose essentiellement d’un rendez-vous quotidien avec root à 2 h du matin.
Une relation professionnelle à éviter.
L’environnement cron : « pourtant ça fonctionne dans mon terminal »
C’est probablement le problème le plus classique avec cron.
Vous exécutez :
/home/alice/scripts/report.sh
dans votre terminal.
Tout fonctionne.
Vous ajoutez le même script dans cron.
Plus rien.
Vous vérifiez le fichier.
Vous vérifiez l’heure.
Vous commencez à remettre en cause le concept même du temps.
La raison est souvent simple : cron ne dispose pas nécessairement du même environnement que votre session interactive.
Il peut notamment avoir :
- un
PATHdifférent ; - aucun environnement virtuel Python activé ;
- aucune variable chargée depuis votre
.bashrc; - un shell différent de celui que vous utilisez habituellement ;
- un répertoire de travail différent de celui que votre script suppose.
Utilisez des chemins absolus
Au lieu de :
0 2 * * * python backup.py
préférez quelque chose comme :
0 2 * * * /usr/bin/python3 /home/alice/scripts/backup.py
Et si le script dépend d’un répertoire particulier :
0 2 * * * cd /home/alice/app && /usr/bin/python3 backup.py
Définir explicitement PATH
Une crontab peut aussi contenir des variables d’environnement :
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
30 2 * * * /usr/local/bin/backup.sh
Définir ce dont la tâche dépend rend son comportement beaucoup plus prévisible.
Les scripts automatisés apprécient particulièrement qu’on ne leur demande pas de deviner.
Le caractère % : le petit piège sadique
Dans une crontab traditionnelle, le caractère % possède une signification spéciale lorsqu’il apparaît dans la partie commande.
Un pourcentage non échappé peut être transformé en saut de ligne, et la suite peut être envoyée à l’entrée standard de la commande.
Cela peut surprendre avec une commande comme :
date +%Y-%m-%d
Dans une crontab, il faut donc généralement échapper les pourcentages :
0 0 * * * /usr/bin/date +\%Y-\%m-\%d
Voilà une fonctionnalité historique que presque personne ne demande et que beaucoup découvrent exactement une fois.
Où vont les sorties de cron ?
Une tâche produit souvent deux flux :
- stdout : la sortie normale ;
- stderr : les erreurs.
Traditionnellement, cron peut envoyer cette sortie par e-mail à l’utilisateur si un système de messagerie local est configuré.
Sur beaucoup de machines modernes, aucun MTA local complet n’est configuré.
Résultat : votre script crie dans une pièce insonorisée.
Rediriger vers un fichier
0 3 * * * /usr/local/bin/script.sh >> /var/log/script.log 2>&1
Ici :
>>ajoute stdout au fichier ;2>&1envoie également stderr vers la même destination.
Ou envoyer vers le journal système
On peut aussi utiliser logger :
0 3 * * * /usr/local/bin/script.sh 2>&1 | /usr/bin/logger -t mon-script
Puis rechercher les messages :
journalctl -t mon-script
Déboguer cron quand il fait semblant de ne pas vous connaître
Lorsqu’une tâche ne fonctionne pas, procédez méthodiquement.
1. Vérifier le service
systemctl status cron
2. Examiner le journal
Sur un système avec systemd :
journalctl -u cron
Pour suivre les nouvelles entrées en direct :
journalctl -u cron -f
Si rsyslog est installé et configuré de manière classique, les événements cron peuvent également apparaître dans :
/var/log/syslog
Un fichier comme :
/var/log/cron.log
n’existe pas nécessairement par défaut : cela dépend de la configuration de la journalisation.
3. Exécuter la commande manuellement
/usr/local/bin/script.sh
Idéalement sous le même utilisateur que cron :
sudo -u alice /usr/local/bin/script.sh
4. Vérifier les permissions
ls -l /usr/local/bin/script.sh
5. Vérifier l’interpréteur
Un script devrait généralement posséder un shebang correct :
#!/bin/bash
ou :
#!/usr/bin/env python3
6. Vérifier les chemins
Ne partez pas du principe que cron trouvera automatiquement vos programmes, vos fichiers de configuration et votre environnement virtuel.
Cron n’a rien contre vous personnellement.
Il ne sait simplement pas que vous aviez ajouté douze choses à votre .bashrc.
Cron et les machines éteintes
Un point essentiel : cron classique n’est pas une machine à remonter le temps.
Si vous planifiez :
0 3 * * * /usr/local/bin/backup.sh
et que l’ordinateur est éteint à 3 h, la tâche n’est généralement pas exécutée rétroactivement lorsque la machine redémarre à 9 h.
Le rendez-vous est passé.
Cron était là.
Votre ordinateur non.
Le dossier est classé.
Anacron : pour les machines qui dorment
C’est précisément le problème que cherche à résoudre anacron.
Anacron est destiné aux tâches périodiques exprimées plutôt en jours qu’en minutes et ne suppose pas que la machine fonctionne en permanence.
Il peut donc être utile sur :
- un ordinateur portable ;
- une station de travail éteinte la nuit ;
- un serveur qui n’est pas opérationnel 24 h/24 ;
- ou toute machine ayant l’audace de dormir à l’heure où vous aviez prévu la maintenance.
Sa configuration traditionnelle se trouve dans :
/etc/anacrontab
Une ligne comprend notamment :
période délai identifiant commande
Par exemple, conceptuellement :
1 5 sauvegarde-quotidienne /usr/local/bin/backup.sh
signifie qu’une tâche doit être exécutée environ une fois par jour, avec le délai prévu lorsqu’anacron constate qu’elle est due.
Sur Debian, anacron peut également prendre en charge les travaux quotidiens, hebdomadaires et mensuels qui seraient autrement lancés par cron.
Cron dit : « Il fallait être là à 3 h. »
Anacron dit : « Vous avez raté 3 h, mais nous devons tout de même faire cette sauvegarde. »
Anacron est donc le collègue qui rattrape le travail oublié.
Personne ne l’aime jusqu’au jour où il devient indispensable.
Sécuriser cron
Une tâche automatisée possède exactement les droits de l’utilisateur qui l’exécute.
Une tâche root possède donc les droits de root.
Cette phrase devrait normalement suffire à provoquer un léger redressement sur votre chaise.
Quelques règles simples
- ne lancez pas en root ce qui peut fonctionner avec un compte moins privilégié ;
- utilisez des scripts dont les permissions sont maîtrisées ;
- évitez les répertoires modifiables par tout le monde ;
- utilisez des chemins absolus ;
- ne placez pas de secrets directement dans une ligne de crontab lorsque cela peut être évité ;
- contrôlez les fichiers et données que le script va traiter ;
- journalisez les erreurs importantes ;
- et ne téléchargez pas un script nommé
totally-safe-backup.shsur un forum abandonné avant de le lancer chaque nuit en root.
cron.allow et cron.deny
Debian prend en charge :
/etc/cron.allow
/etc/cron.deny
Si /etc/cron.allow existe, seuls les utilisateurs autorisés par ce fichier peuvent utiliser crontab.
Sinon, /etc/cron.deny peut servir à interdire certains utilisateurs.
Sur un système Debian standard, les utilisateurs peuvent normalement utiliser crontab en l’absence de restrictions spécifiques.
Ces fichiers contrôlent principalement l’utilisation de la commande crontab. Ils ne constituent pas une baguette magique annulant nécessairement les tâches déjà installées.
at : « fais ça une fois, plus tard »
at répond à un besoin différent.
Vous ne voulez pas exécuter quelque chose tous les jours.
Vous voulez simplement dire :
« Exécute cette commande dans dix minutes, puis ne m’en reparle plus. »
C’est exactement le rôle d’at.
Installer at sous Debian
Le paquet n’est pas nécessairement installé :
sudo apt install at
Les tâches sont exécutées par le démon atd.
Vérifiez-le avec :
systemctl status atd
Et si nécessaire :
sudo systemctl enable --now atd
Sans atd, vous pouvez remplir la file de tâches avec tout l’enthousiasme du monde : personne ne viendra les exécuter.
Programmer une tâche avec at
Dans dix minutes
echo "/home/alice/script.sh" | at now + 10 minutes
Aujourd’hui à 15 h
at 15:00
at ouvre alors une invite interactive :
warning: commands will be executed using /bin/sh
at> /home/alice/script.sh
at> <Ctrl+D>
Ctrl+D termine la saisie et enregistre la tâche.
Demain après-midi
at 3pm tomorrow
À minuit
at midnight
Dans deux heures
at now + 2 hours
Les syntaxes temporelles acceptées sont relativement souples.
Une qualité appréciable lorsque l’on programme une tâche unique et légèrement inquiétante.
Voir les tâches at en attente
atq
Une sortie peut ressembler à :
7 Sat Aug 22 15:00:00 2026 a alice
8 Sat Aug 22 18:30:00 2026 a alice
Le premier nombre est l’identifiant du job.
Supprimer une tâche at
atrm 7
Le job numéro 7 disparaît de la file.
Il n’aura jamais lieu.
Une petite branche temporelle vient de s’éteindre, et personne ne saura jamais ce que script.sh comptait faire à 15 h.
Inspecter une tâche at
Pour afficher le contenu d’un job :
at -c 7
C’est particulièrement utile lorsqu’on se retrouve devant une tâche programmée trois semaines auparavant avec un identifiant qui ne rappelle absolument rien.
at et son environnement
Lorsqu’un job est soumis avec at, l’outil conserve une partie de l’environnement du moment où la tâche a été créée.
Mais comme avec cron, il reste prudent de concevoir des tâches autonomes :
- utiliser des chemins absolus ;
- ne pas dépendre d’un terminal interactif ;
- rediriger les sorties si nécessaire ;
- s’assurer que les fichiers existeront encore au moment de l’exécution.
Une tâche programmée pour demain qui dépend d’un fichier temporaire supprimé ce soir possède ce que l’on appelle techniquement un avenir compliqué.
Les sorties des tâches at
at peut envoyer la sortie du job par courrier local.
Là encore, cela suppose qu’un système de messagerie local puisse effectivement distribuer ce courrier.
Pour une journalisation explicite :
echo "/home/alice/script.sh >> /home/alice/script.log 2>&1" | at 23:00
Ou vers le journal système :
echo "/home/alice/script.sh 2>&1 | logger -t at-script" | at 23:00
Contrôler qui peut utiliser at
Deux fichiers remplissent ce rôle :
/etc/at.allow
/etc/at.deny
Le principe est le suivant :
- si
/etc/at.allowexiste, seuls les utilisateurs qui y figurent peuvent utiliserat; - sinon, si
/etc/at.denyexiste, tous les utilisateurs sauf ceux qui y figurent peuvent l’utiliser ; - un
/etc/at.denyvide autorise donc tous les utilisateurs ; - si aucun des deux fichiers n’existe, l’implémentation Debian d’
atréserve normalement son utilisation au superutilisateur.
Root conserve évidemment ses privilèges.
Root conserve toujours ses privilèges.
C’est en partie pour cela que root est rarement invité aux activités de groupe.
Et batch ? Le cousin discret d’at
Le paquet at fournit également la commande batch.
Elle permet de mettre une commande en attente afin qu’elle soit exécutée lorsque la charge du système descend suffisamment.
Par exemple :
echo "/usr/local/bin/heavy-job.sh" | batch
C’est utile pour certains travaux lourds qui ne sont pas urgents.
Au lieu de dire :
« Lance ça à 14 h. »
on dit :
« Lance ça lorsque la machine arrêtera de souffrir. »
Une forme primitive mais néanmoins respectable d’empathie envers le processeur.
Cron ou at ?
| Besoin | Outil |
|---|---|
| Exécuter une tâche tous les jours | cron |
| Exécuter une tâche tous les lundis | cron |
| Exécuter une tâche toutes les cinq minutes | cron |
| Exécuter une commande une fois dans dix minutes | at |
| Exécuter quelque chose une seule fois demain | at |
| Attendre une charge système suffisamment faible | batch |
| Rattraper des tâches périodiques après une extinction | anacron ou timer systemd persistant |
Et systemd timers dans tout ça ?
Sur un Debian moderne, il serait dommage de parler d’automatisation sans mentionner les timers systemd.
Ils remplissent une partie des mêmes fonctions que cron, mais avec une intégration plus profonde à systemd.
Un timer est généralement associé à un service.
Par exemple :
/etc/systemd/system/backup.service
pour décrire ce qu’il faut exécuter, et :
/etc/systemd/system/backup.timer
pour indiquer quand l’exécuter.
Exemple de service
[Unit]
Description=Sauvegarde quotidienne
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
Exemple de timer
[Unit]
Description=Lance la sauvegarde quotidienne
[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true
[Install]
WantedBy=timers.target
Puis :
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
Afficher les timers
systemctl list-timers
Examiner les journaux
journalctl -u backup.service
Pourquoi utiliser un timer systemd ?
Les timers apportent plusieurs avantages intéressants :
- journalisation naturellement intégrée à
journalctl; - dépendances explicites envers d’autres services ;
- limitation et isolation possibles via les options systemd ;
- planification calendaire ou relative au démarrage ;
- possibilité de répartir les exécutions avec des délais aléatoires ;
- et possibilité de rattraper certaines exécutions manquées.
Persistent=true : rattraper le rendez-vous manqué
Avec :
Persistent=true
un timer basé sur OnCalendar= peut détecter qu’une exécution aurait dû se produire pendant que le timer ou la machine était inactif et déclencher le service au retour.
C’est une différence importante avec une tâche cron classique.
Cron :
« Il fallait être allumé à 2 h 30. »
Timer systemd persistant :
« Vous avez raté la sauvegarde de 2 h 30. On s’en occupe maintenant. »
L’un est ponctuel.
L’autre garde les dossiers.
Cron ou timer systemd ?
Il n’est pas nécessaire de déclarer une guerre de religion supplémentaire.
Cron reste parfaitement adapté à beaucoup de tâches simples :
0 2 * * * /usr/local/bin/backup.sh
C’est court, lisible et connu de presque tous les administrateurs Unix.
Un timer systemd devient particulièrement intéressant lorsque vous avez besoin :
- de dépendances entre services ;
- d’une journalisation centralisée ;
- d’un contrôle précis de l’environnement d’exécution ;
- d’une politique de sécurité systemd ;
- de rattraper les exécutions manquées ;
- ou d’une tâche suffisamment importante pour mériter une unité dédiée.
Pour lancer un petit script chaque nuit, cron reste très élégant.
Pour orchestrer un service critique avec dépendances, reprise, restrictions et journalisation structurée, systemd offre davantage de leviers.
Utiliser quinze lignes de systemd pour exécuter touch /tmp/test une fois par jour reste cependant autorisé.
La loi ne peut pas tout empêcher.
Quelques erreurs classiques à éviter
« Mon script marche en terminal mais pas dans cron »
Vérifiez le PATH, les variables d’environnement, le shell, le répertoire courant et les permissions.
« J’ai mis mon script dans cron.daily et il ne démarre jamais »
Vérifiez notamment :
run-parts --test /etc/cron.daily
et le nom du fichier.
« Ma tâche du premier lundi s’exécute tous les lundis ET le premier du mois »
Vous venez de rencontrer la logique particulière entre les champs « jour du mois » et « jour de la semaine ».
« Ma commande contenant date +%F ne fonctionne pas »
Échappez le caractère % dans la crontab.
« Ma tâche quotidienne n’a pas tourné cette nuit »
La machine était-elle allumée à l’heure prévue ?
Sinon, intéressez-vous à anacron ou aux timers systemd persistants.
« at accepte ma tâche mais rien ne se passe »
Vérifiez :
systemctl status atd
Une file d’attente sans démon pour la traiter est essentiellement une liste de souhaits.
Une méthode raisonnable avant d’automatiser
Avant de confier une commande au temps lui-même :
- exécutez-la manuellement ;
- exécutez-la avec le bon utilisateur ;
- utilisez des chemins absolus ;
- vérifiez les permissions ;
- décidez où doivent aller stdout et stderr ;
- évitez deux exécutions simultanées si le script ne les supporte pas ;
- testez les conséquences d’un échec ;
- et seulement ensuite, planifiez-la.
Pour les tâches critiques, il faut également se demander ce qui se passe si l’exécution précédente n’est pas terminée lorsque la suivante commence.
Une sauvegarde prévue toutes les dix minutes qui dure quinze minutes finit par produire une forme très particulière d’élevage intensif de processus.
Éviter les exécutions simultanées avec flock
Une solution simple consiste à utiliser flock.
Par exemple :
*/10 * * * * /usr/bin/flock -n /run/user/1000/mon-script.lock /home/alice/script.sh
L’option -n demande à flock d’abandonner immédiatement si le verrou est déjà détenu.
Pour une tâche système exécutée avec un autre utilisateur, choisissez évidemment un emplacement de verrou approprié et accessible à cet utilisateur.
Le principe est simple : une seule copie du travail à la fois.
Une règle que les réunions auraient également intérêt à adopter.
Résumé
| Outil | Usage principal | À retenir |
|---|---|---|
| cron | Tâches récurrentes | Simple, historique, efficace |
| at | Tâche unique dans le futur | Nécessite le service atd |
| batch | Tâche différée selon la charge | Fourni avec at |
| anacron | Tâches périodiques sur machines non permanentes | Peut rattraper des travaux quotidiens ou périodiques |
| systemd timer | Planification moderne intégrée à systemd | Logs, dépendances, options de sécurité et persistance |
Conclusion : automatiser, puis surveiller l’automatisation
La planification de tâches est l’une des fonctions les plus utiles d’un système Unix.
cron permet d’exécuter des traitements récurrents depuis des décennies avec une syntaxe compacte et relativement simple.
at s’occupe des actions ponctuelles.
anacron vient au secours des machines qui n’ont pas eu la courtoisie de rester allumées.
Et les timers systemd apportent une approche plus moderne, plus intégrée et parfois mieux adaptée aux services importants.
Mais automatiser une commande ne signifie pas qu’on peut ensuite oublier son existence.
Une sauvegarde automatique qu’on ne contrôle jamais est simplement une croyance.
Un script automatique sans logs est un suspect sans casier.
Et une crontab root modifiée un vendredi soir est généralement le début d’une histoire racontée le lundi avec beaucoup moins d’enthousiasme.
Automatisez donc.
Journalisez.
Surveillez.
Et avant d’enregistrer une ligne contenant cinq étoiles, recomptez-les.
Le temps est impitoyable. Cron aussi.
