automation
cron
scheduling
systemd
Cron & Systemd Timers
Planification de tùches sous Linux : méthode classique et moderne.
Cron (Le Standard)
Syntaxe de la Crontab
ââââââââââââââ minute (0 - 59)
â ââââââââââââââ hour (0 - 23)
â â ââââââââââââââ day of month (1 - 31)
â â â ââââââââââââââ month (1 - 12)
â â â â ââââââââââââââ day of week (0 - 6) (Sunday = 0)
â â â â â
* * * * * command
Champ
Valeurs
CaractÚres spéciaux
Minute
0-59
* , - /
Hour
0-23
* , - /
Day of Month
1-31
* , - /
Month
1-12
* , - /
Day of Week
0-6
* , - /
Exemples Courants
Expression
Description
* * * * *
Chaque minute
0 * * * *
Chaque heure
0 0 * * *
Chaque jour Ă minuit
0 0 * * 0
Chaque dimanche Ă minuit
0 0 1 * *
Premier du mois Ă minuit
*/15 * * * *
Toutes les 15 minutes
0 9-17 * * 1-5
9h-17h, lundi-vendredi
0 0 1,15 * *
1er et 15 du mois
Crontab User vs SystĂšme
Type
Commande/Fichier
Utilisateur
User
crontab -e
Utilisateur courant
User
crontab -e -u john
Utilisateur spécifique (root)
SystĂšme
/etc/crontab
Spécifié dans la ligne
SystĂšme
/etc/cron.d/*
Spécifié dans la ligne
# Crontab utilisateur
crontab -e # Ăditer
crontab -l # Lister
crontab -r # Supprimer
# Format /etc/crontab et /etc/cron.d/* (avec USER)
# Min Hour Dom Mon Dow USER Command
0 0 * * * root /usr/local/bin/backup.sh
Répertoires Prédéfinis
/etc/cron.hourly/ # Scripts exécutés chaque heure
/etc/cron.daily/ # Scripts exécutés chaque jour
/etc/cron.weekly/ # Scripts exécutés chaque semaine
/etc/cron.monthly/ # Scripts exécutés chaque mois
Astuces de Pro
Redirection des Logs
# Capturer stdout ET stderr
* * * * * /opt/scripts/backup.sh >> /var/log/backup.log 2 >& 1
# Avec timestamp
* * * * * /opt/scripts/backup.sh 2 >& 1 | while read line; do echo " $( date '+\%Y-\%m-\%d \%H:\%M:\%S' ) $line " ; done >> /var/log/backup.log
Ăviter le Spam Mail
# En tĂȘte de crontab : dĂ©sactiver les mails
MAILTO = ""
# Ou rediriger vers /dev/null
* * * * * /opt/scripts/task.sh > /dev/null 2 >& 1
Variables d'Environnement
# Définir le PATH (cron a un PATH minimal)
PATH = /usr/local/bin:/usr/bin:/bin
# Définir le shell
SHELL = /bin/bash
# Exemple complet
SHELL = /bin/bash
PATH = /usr/local/bin:/usr/bin:/bin
MAILTO = ""
0 0 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2 >& 1
Systemd Timers (L'Alternative Moderne)
Pourquoi Remplacer Cron ?
Aspect
Cron
Systemd Timer
Logs
Syslog, difficile Ă filtrer
Journald natif
Précision
Minute
Seconde
Dépendances
Aucune
Services systemd
Rattrapage
Non
Persistent=true
Monitoring
crontab -l
systemctl list-timers
Ressources
Aucun contrĂŽle
Cgroups, limits
Structure : 2 Fichiers Requis
Un timer systemd nécessite deux fichiers :
.service : Définit la tùche à exécuter
.timer : Définit quand l'exécuter
/etc/systemd/system/
âââ backup.service # Quoi faire
âââ backup.timer # Quand le faire
Exemple Concret : Backup Quotidien
backup.service
# /etc/systemd/system/backup.service
[Unit]
Description = Daily Backup Script
After = network.target
[Service]
Type = oneshot
ExecStart = /opt/scripts/backup.sh
User = root
StandardOutput = journal
StandardError = journal
backup.timer
# /etc/systemd/system/backup.timer
[Unit]
Description = Run backup daily
[Timer]
OnCalendar = daily
# Ou plus précis : OnCalendar=*-*-* 02:00:00
Persistent = true
RandomizedDelaySec = 300
[Install]
WantedBy = timers.target
Syntaxe OnCalendar
Expression
Description
minutely
Chaque minute
hourly
Chaque heure
daily
Chaque jour Ă 00:00
weekly
Chaque lundi Ă 00:00
monthly
Premier du mois Ă 00:00
*-*-* 02:00:00
Chaque jour Ă 02:00
Mon *-*-* 09:00:00
Chaque lundi Ă 09:00
*-*-01 00:00:00
Premier du mois
*:0/15
Toutes les 15 minutes
# Valider une expression
systemd-analyze calendar "Mon *-*-* 09:00:00"
# Output:
# Original form: Mon *-*-* 09:00:00
# Next elapse: Mon 2024-01-15 09:00:00 CET
Activer et Gérer
# Recharger systemd
sudo systemctl daemon-reload
# Activer le timer (pas le service !)
sudo systemctl enable backup.timer
sudo systemctl start backup.timer
# Vérifier
sudo systemctl status backup.timer
# Lister tous les timers
systemctl list-timers --all
# Exécuter manuellement le service
sudo systemctl start backup.service
# Voir les logs
journalctl -u backup.service
journalctl -u backup.service --since today
Options Timer Utiles
[Timer]
# Exécution calendaire
OnCalendar = *-*-* 02:00:00
# Délai aléatoire (évite les pics)
RandomizedDelaySec = 1h
# Rattraper les exécutions manquées
Persistent = true
# Exécution au boot + intervalle
OnBootSec = 5min
OnUnitActiveSec = 1h
Sécurité (SecNumCloud)
Restreindre l'AccĂšs Ă Cron
ContrĂŽle d'AccĂšs Cron
Par défaut, tous les utilisateurs peuvent créer des crontabs.
En environnement sécurisé, restreindre via allow/deny.
Logique des Fichiers
Fichier
Existe
Comportement
/etc/cron.allow
Oui
Seuls les users listés peuvent utiliser cron
/etc/cron.deny
Oui
Users listés ne peuvent PAS utiliser cron
Aucun
-
Tous les users peuvent utiliser cron
Priorité : cron.allow est vérifié en premier. S'il existe, cron.deny est ignoré.
Configuration Recommandée
# Créer la whitelist (seul root peut utiliser cron)
echo "root" | sudo tee /etc/cron.allow
# Ajouter un utilisateur autorisé
echo "deploy" | sudo tee -a /etc/cron.allow
# Vérifier
cat /etc/cron.allow
# Supprimer cron.deny si présent
sudo rm -f /etc/cron.deny
Audit des Crontabs
# Lister toutes les crontabs utilisateur
for user in $( cut -f1 -d: /etc/passwd) ; do
crontab -l -u $user 2 >/dev/null && echo "=== $user ==="
done
# Vérifier les fichiers /etc/cron.d/
ls -la /etc/cron.d/
# Vérifier les répertoires cron.*
ls -la /etc/cron.{ hourly,daily,weekly,monthly} /
Référence Rapide
# === CRON ===
crontab -e # Ăditer crontab user
crontab -l # Lister
crontab -r # Supprimer
# Syntaxe : Min Hour Dom Mon Dow Command
0 2 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2 >& 1
# === SYSTEMD TIMERS ===
systemctl list-timers # Lister les timers
systemctl enable backup.timer # Activer
systemctl start backup.timer # Démarrer
journalctl -u backup.service # Logs
# Valider expression
systemd-analyze calendar "daily"
# === SĂCURITĂ ===
echo "root" > /etc/cron.allow # Whitelist