Cron jobs et systemd timers — Planifier des tâches sur Linux
La planification de tâches est indispensable : sauvegardes, nettoyages, envois d'emails... Cron est le vieux standard, systemd timers sont l'alternative moderne.
Cron — La syntaxe expliquée
┌───────────── minute (0-59)
│ ┌───────────── heure (0-23)
│ │ ┌───────────── jour du mois (1-31)
│ │ │ ┌───────────── mois (1-12)
│ │ │ │ ┌───────────── jour de la semaine (0-7, 0=dimanche)
│ │ │ │ │
* * * * * commande
Exemples pratiques
# Editer le crontab de l'utilisateur courant
crontab -e
# Editer le crontab root
sudo crontab -e
# Chaque minute
* * * * * /usr/bin/php /var/www/neotoad/artisan schedule:run
# Tous les jours à 3h du matin
0 3 * * * /usr/bin/bash /home/ubuntu/backup.sh
# Tous les lundis à 8h30
30 8 * * 1 /usr/bin/python3 /home/ubuntu/weekly-report.py
# Toutes les 6 heures
0 */6 * * * /usr/bin/php /var/www/neotoad/artisan queue:restart
# Le 1er de chaque mois
0 0 1 * * /usr/bin/bash /home/ubuntu/monthly-cleanup.sh
Laravel Schedule dans Cron
Laravel a son propre scheduler — vous n'avez besoin que d'une seule ligne cron :
# Une entrée cron, toutes les minutes
* * * * * cd /var/www/neotoad && php artisan schedule:run >> /dev/null 2>&1
// routes/console.php ou app/Console/Kernel.php
Schedule::command('app:send-newsletter')->weeklyOn(1, '8:00');
Schedule::command('cache:clear')->daily();
Schedule::command('backup:run')->dailyAt('03:00');
Schedule::job(new ProcessPendingArticles)->everyFiveMinutes();
Systemd Timers — L'alternative moderne
Systemd timers remplacent avantageusement cron pour les services système.
Avantages sur cron
- Logs centralisés via
journalctl - Gestion des dépendances (démarrer après un service)
- Rattrapage des tâches manquées (
Persistent=true) - Status et statistiques facilement consultables
Exemple : backup automatique
# /etc/systemd/system/neotoad-backup.service
[Unit]
Description=Sauvegarde NeoToad
After=network.target
[Service]
Type=oneshot
User=ubuntu
ExecStart=/usr/bin/bash /home/ubuntu/scripts/backup.sh
StandardOutput=journal
StandardError=journal
# /etc/systemd/system/neotoad-backup.timer
[Unit]
Description=Timer sauvegarde NeoToad
Requires=neotoad-backup.service
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true # Rattraper si le serveur était éteint
RandomizedDelaySec=300 # Décaler aléatoirement de 0-5 min
[Install]
WantedBy=timers.target
# Activer et démarrer le timer
sudo systemctl enable neotoad-backup.timer
sudo systemctl start neotoad-backup.timer
# Vérifier
sudo systemctl status neotoad-backup.timer
sudo systemctl list-timers --all
Script de backup robuste
#!/usr/bin/env bash
# /home/ubuntu/scripts/backup.sh
set -euo pipefail # Arrêter sur toute erreur
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/var/backups/neotoad"
APP_DIR="/var/www/neotoad"
DB_NAME="neotoad"
# Créer le répertoire de backup
mkdir -p "$BACKUP_DIR"
# Backup de la base de données
echo "[${TIMESTAMP}] Sauvegarde de la base de données..."
mysqldump -u root "$DB_NAME" | gzip > "${BACKUP_DIR}/db_${TIMESTAMP}.sql.gz"
# Backup des fichiers utilisateur
echo "[${TIMESTAMP}] Sauvegarde des fichiers..."
tar -czf "${BACKUP_DIR}/files_${TIMESTAMP}.tar.gz" \
"${APP_DIR}/storage/app/public"
# Synchroniser vers S3 (optionnel)
# aws s3 sync "$BACKUP_DIR" "s3://mon-bucket/backups/"
# Nettoyer les backups de plus de 30 jours
find "$BACKUP_DIR" -name "*.gz" -mtime +30 -delete
echo "[${TIMESTAMP}] Sauvegarde terminée avec succès."
Déboguer les cron jobs
# Les cron jobs ne trouvent pas les commandes ?
# → Le PATH est limité dans cron, utilisez les chemins absolus
# Capturer les erreurs
* * * * * /mon/script.sh >> /var/log/myjob.log 2>&1
# Vérifier les logs cron
grep CRON /var/log/syslog
# Tester manuellement avec l'environnement cron
env -i HOME=/root SHELL=/bin/bash /mon/script.sh
Aucun commentaire pour le moment.