Linux & Serveurs

Cron jobs et systemd timers — Planifier des tâches sur Linux

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

// Commentaires (0)

Connectez-vous pour laisser un commentaire.

Aucun commentaire pour le moment.