Aller au contenu principal

Tâches planifiées


Table des matières

  1. Introduction à cron
  2. Syntaxe crontab
  3. Exemples de tâches courantes
  4. anacron pour machines non-24/7
  5. systemd timers
  6. 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

FichierPortéeÉdition
User crontabPar utilisateurcrontab -e
/etc/crontabSystèmeédition directe
/etc/cron.d/*Système (fichiers)édition directe
/etc/cron.daily/Scripts quotidiensdéposer script
/etc/cron.hourly/Scripts horairesdé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èreSignification
*Toutes les valeurs
,Liste de valeurs
-Plage de valeurs
/Pas (intervalle)

Exemples de planification

CronSignification
0 * * * *Toutes les heures (minute 0)
0 0 * * *Tous les jours à minuit
30 8 * * *Tous les jours à 8h30
0 0 * * 0Tous les dimanches à minuit
0 0 1 * *Le 1er de chaque mois
*/15 * * * *Toutes les 15 minutes
0 9-18 * * 1-5Toutes les heures de 9h à 18h, lundi-vendredi
0 0,12 * * *À minuit et midi
@rebootAu démarrage

Raccourcis

RaccourciÉquivalent
@rebootAu démarrage
@yearly0 0 1 1 *
@monthly0 0 1 * *
@weekly0 0 * * 0
@daily0 0 * * *
@hourly0 * * * *

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
astuce

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
ChampDescription
periodFréquence en jours
delayDélai en minutes après démarrage
identifierNom unique
commandCommande à 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 :

  1. Un fichier .timer (planification)
  2. 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

ExpressionSignification
*-*-* 02:00:00Tous les jours à 2h
Mon *-*-* 10:00:00Tous les lundis à 10h
*-*-01 00:00:00Le 1er de chaque mois
hourlyToutes les heures
dailyTous les jours
weeklyToutes les semaines

Options utiles

OptionDescription
OnCalendarPlanification absolue
OnBootSecAprès le démarrage
OnUnitActiveSecAprès la dernière exécution
Persistent=trueRattrape les exécutions manquées
RandomizedDelaySecDé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 ?

  1. 30 4 * * *
  2. 0 */2 * * *
  3. 0 9-17 * * 1-5
  4. 0 0 1,15 * *
Réponses
  1. Tous les jours à 4h30
  2. Toutes les 2 heures, à la minute 0
  3. Toutes les heures de 9h à 17h, du lundi au vendredi
  4. 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 →