Tâches planifiées
Table des matières
- Introduction à cron
- Syntaxe crontab
- Exemples de tâches courantes
- anacron pour machines non-24/7
- systemd timers
- Exercices pratiques
1 - Introduction à cron
Qu'est-ce que cron ?
cron est le planificateur de tâches standard sous Linux. Il exécute des commandes à des moments précis.
Types de crontab
| Fichier | Portée | Édition |
|---|---|---|
| User crontab | Par utilisateur | crontab -e |
/etc/crontab | Système | édition directe |
/etc/cron.d/* | Système (fichiers) | édition directe |
/etc/cron.daily/ | Scripts quotidiens | déposer script |
/etc/cron.hourly/ | Scripts horaires | déposer script |
Gérer son crontab
# Éditer son crontab
crontab -e
# Lister son crontab
crontab -l
# Supprimer son crontab
crontab -r
# Éditer le crontab d'un autre utilisateur (root)
sudo crontab -u john -e
🔝 Retour à la table des matières
2 - Syntaxe crontab
Format
┌───────────── minute (0 - 59)
│ ┌───────────── heure (0 - 23)
│ │ ┌───────────── jour du mois (1 - 31)
│ │ │ ┌───────────── mois (1 - 12)
│ │ │ │ ┌───────────── jour de la semaine (0 - 7, 0 ou 7 = dimanche)
│ │ │ │ │
* * * * * commande à exécuter
Caractères spéciaux
| Caractère | Signification |
|---|---|
* | Toutes les valeurs |
, | Liste de valeurs |
- | Plage de valeurs |
/ | Pas (intervalle) |
Exemples de planification
| Cron | Signification |
|---|---|
0 * * * * | Toutes les heures (minute 0) |
0 0 * * * | Tous les jours à minuit |
30 8 * * * | Tous les jours à 8h30 |
0 0 * * 0 | Tous les dimanches à minuit |
0 0 1 * * | Le 1er de chaque mois |
*/15 * * * * | Toutes les 15 minutes |
0 9-18 * * 1-5 | Toutes les heures de 9h à 18h, lundi-vendredi |
0 0,12 * * * | À minuit et midi |
@reboot | Au démarrage |
Raccourcis
| Raccourci | Équivalent |
|---|---|
@reboot | Au démarrage |
@yearly | 0 0 1 1 * |
@monthly | 0 0 1 * * |
@weekly | 0 0 * * 0 |
@daily | 0 0 * * * |
@hourly | 0 * * * * |
Variables d'environnement
# En haut du crontab
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
[email protected]
# Puis les tâches
0 * * * * /scripts/backup.sh
🔝 Retour à la table des matières
3 - Exemples de tâches courantes
Backup quotidien
# Tous les jours à 2h du matin
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
Nettoyage des logs
# Tous les dimanches à 3h
0 3 * * 0 find /var/log -name "*.log" -mtime +30 -delete
Synchronisation
# Toutes les 6 heures
0 */6 * * * rsync -avz /data/ backup@remote:/backup/
Monitoring
# Toutes les 5 minutes
*/5 * * * * /scripts/check_services.sh
Script de backup complet
#!/bin/bash
# /usr/local/bin/backup.sh
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backup"
SOURCE="/var/www"
# Créer le backup
tar -czf "$BACKUP_DIR/www_$DATE.tar.gz" "$SOURCE"
# Garder seulement les 7 derniers
find "$BACKUP_DIR" -name "www_*.tar.gz" -mtime +7 -delete
echo "Backup completed: $DATE"
Bonnes pratiques
# 1. Toujours rediriger la sortie
0 * * * * /script.sh >> /var/log/script.log 2>&1
# 2. Utiliser des chemins absolus
0 * * * * /usr/bin/python3 /home/user/script.py
# 3. Verrouiller pour éviter les exécutions multiples
*/5 * * * * flock -n /tmp/script.lock /script.sh
Utilisez crontab.guru pour visualiser et tester vos expressions cron !
🔝 Retour à la table des matières
4 - anacron pour machines non-24/7
Problème avec cron
cron ne rattrape pas les tâches manquées si la machine était éteinte.
Solution : anacron
anacron exécute les tâches manquées au prochain démarrage.
# /etc/anacrontab
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# period delay identifier command
1 5 daily run-parts /etc/cron.daily
7 10 weekly run-parts /etc/cron.weekly
@monthly 15 monthly run-parts /etc/cron.monthly
| Champ | Description |
|---|---|
| period | Fréquence en jours |
| delay | Délai en minutes après démarrage |
| identifier | Nom unique |
| command | Commande à exécuter |
Répertoires système
Déposez simplement vos scripts dans :
/etc/cron.daily/ # Exécutés quotidiennement
/etc/cron.weekly/ # Exécutés hebdomadairement
/etc/cron.monthly/ # Exécutés mensuellement
# Exemple : script de nettoyage
sudo nano /etc/cron.daily/clean-tmp
#!/bin/bash
find /tmp -type f -mtime +7 -delete
# Rendre exécutable
sudo chmod +x /etc/cron.daily/clean-tmp
🔝 Retour à la table des matières
5 - systemd timers
Alternative moderne à cron
Les timers systemd offrent plus de fonctionnalités.
Structure
Un timer nécessite deux fichiers :
- Un fichier
.timer(planification) - Un fichier
.service(action)
Exemple : backup quotidien
Le service :
# /etc/systemd/system/backup.service
[Unit]
Description=Daily Backup
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
Le timer :
# /etc/systemd/system/backup.timer
[Unit]
Description=Run backup daily
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
Activer le timer
# Recharger systemd
sudo systemctl daemon-reload
# Activer et démarrer
sudo systemctl enable --now backup.timer
# Vérifier
sudo systemctl list-timers
Syntaxe OnCalendar
| Expression | Signification |
|---|---|
*-*-* 02:00:00 | Tous les jours à 2h |
Mon *-*-* 10:00:00 | Tous les lundis à 10h |
*-*-01 00:00:00 | Le 1er de chaque mois |
hourly | Toutes les heures |
daily | Tous les jours |
weekly | Toutes les semaines |
Options utiles
| Option | Description |
|---|---|
OnCalendar | Planification absolue |
OnBootSec | Après le démarrage |
OnUnitActiveSec | Après la dernière exécution |
Persistent=true | Rattrape les exécutions manquées |
RandomizedDelaySec | Délai aléatoire |
Commandes utiles
# Lister les timers
systemctl list-timers
# Statut d'un timer
systemctl status backup.timer
# Logs de l'exécution
journalctl -u backup.service
# Exécuter manuellement
sudo systemctl start backup.service
🔝 Retour à la table des matières
6 - Exercices pratiques
Exercice 1 : Premier crontab
# 1. Ouvrez votre crontab
crontab -e
# 2. Ajoutez une tâche de test (toutes les minutes)
* * * * * echo "Test $(date)" >> /tmp/cron_test.log
# 3. Attendez 2 minutes puis vérifiez
cat /tmp/cron_test.log
# 4. Supprimez la tâche
crontab -e
# (supprimez la ligne)
Exercice 2 : Script de monitoring
# 1. Créez le script
cat << 'EOF' | sudo tee /usr/local/bin/disk_check.sh
#!/bin/bash
USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ "$USAGE" -gt 80 ]; then
echo "ALERTE: Disque à $USAGE% - $(date)" >> /var/log/disk_alert.log
fi
EOF
sudo chmod +x /usr/local/bin/disk_check.sh
# 2. Ajoutez au crontab (toutes les heures)
crontab -e
# 0 * * * * /usr/local/bin/disk_check.sh
Exercice 3 : Comprendre la syntaxe
Que signifient ces expressions ?
30 4 * * *0 */2 * * *0 9-17 * * 1-50 0 1,15 * *
Réponses
- Tous les jours à 4h30
- Toutes les 2 heures, à la minute 0
- Toutes les heures de 9h à 17h, du lundi au vendredi
- Le 1er et le 15 de chaque mois à minuit
Quiz
Q1. Comment éditer son crontab ?
Réponse
crontab -e
Q2. Que signifie */15 * * * * ?
Réponse
Toutes les 15 minutes
Q3. Quel est l'avantage de systemd timers sur cron ?
Réponse
Intégration avec journald (logs), Persistent (rattrapage), plus de flexibilité
🔝 Retour à la table des matières
Points clés à retenir
- crontab -e pour éditer, crontab -l pour lister
- Format :
minute heure jour mois jour_semaine commande - Toujours rediriger la sortie (
>> logfile 2>&1) - Utiliser des chemins absolus
- anacron pour les machines qui ne tournent pas 24/7
- systemd timers = alternative moderne avec plus de fonctionnalités
- Tester avec crontab.guru
🔝 Retour à la table des matières
← Chapitre précédent | Chapitre suivant : Archivage et compression →