---
title: "Cron & Automatisation Linux"
domain: sysadmin
subdomain: linux
type: snippet
tags: [linux, cron, crontab, systemd-timer, automation, scheduling]
difficulty: beginner
status: stable
updated: "2025-05-10"
---
## Crontab

```bash
# Éditer la crontab de l'utilisateur courant
crontab -e

# Éditer la crontab d'un autre utilisateur (root)
crontab -u {{USER}} -e

# Lister les tâches
crontab -l
crontab -u {{USER}} -l

# Supprimer toutes les tâches
crontab -r
```

## Syntaxe cron

```
┌─────────── minute (0-59)
│ ┌───────── heure (0-23)
│ │ ┌─────── jour du mois (1-31)
│ │ │ ┌───── mois (1-12)
│ │ │ │ ┌─── jour de la semaine (0-7, 0 et 7 = dimanche)
│ │ │ │ │
* * * * * commande

# Exemples
0 2 * * *     /opt/backup.sh          # tous les jours à 2h00
*/15 * * * *  /usr/bin/check.sh       # toutes les 15 minutes
0 9 * * 1-5   /scripts/report.sh      # lundi-vendredi à 9h
0 0 1 * *     /scripts/monthly.sh     # 1er du mois à minuit
@reboot       /opt/start-agent.sh     # au démarrage
@daily        /opt/cleanup.sh         # 1x par jour (= 0 0 * * *)
@hourly       /opt/sync.sh            # 1x par heure
```

## Variables d'environnement en crontab

```bash
# Définir des variables en haut de la crontab
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAILTO={{EMAIL}}   # envoyer les erreurs par email (vide = pas d'email)

# Exemple complet
MAILTO=""
0 3 * * * /opt/backup.sh >> /var/log/backup.log 2>&1
```

## Cron système

```bash
# Fichiers de cron système
/etc/crontab           # crontab système (avec champ user)
/etc/cron.d/           # fichiers de cron par application
/etc/cron.daily/       # scripts exécutés quotidiennement
/etc/cron.weekly/      # scripts exécutés hebdomadairement
/etc/cron.monthly/     # scripts exécutés mensuellement
/etc/cron.hourly/      # scripts exécutés toutes les heures

# Format /etc/crontab (avec champ utilisateur)
0 2 * * * root /opt/backup.sh

# Placer un script dans cron.daily (doit être exécutable, sans extension)
cp backup.sh /etc/cron.daily/backup
chmod +x /etc/cron.daily/backup
```

## Logs cron

```bash
# Voir les exécutions cron
grep CRON /var/log/syslog
journalctl -u cron
journalctl -u crond

# Tester si un script marche en cron (simuler l'env)
env -i HOME=/root SHELL=/bin/sh /bin/sh -c "votre_commande"
```

## at — Tâche unique planifiée

```bash
# Exécuter à une heure précise
echo "/opt/deploy.sh" | at 14:30
echo "/opt/deploy.sh" | at 2:30 PM

# Demain ou dans X temps
echo "commande" | at tomorrow
echo "commande" | at now + 2 hours
echo "commande" | at now + 30 minutes

# Lister les tâches at
atq

# Supprimer une tâche at
atrm {{JOB_ID}}
```

## Timers systemd — alternative moderne

```bash
# Créer un service à déclencher
# /etc/systemd/system/backup.service
[Unit]
Description=Backup quotidien

[Service]
Type=oneshot
ExecStart=/opt/backup.sh
User=backup

# Créer le timer associé
# /etc/systemd/system/backup.timer
[Unit]
Description=Déclencheur backup quotidien

[Timer]
OnCalendar=*-*-* 02:00:00     # tous les jours à 2h
Persistent=true                 # rattraper si la machine était éteinte

[Install]
WantedBy=timers.target
```

```bash
# Activer et démarrer
systemctl daemon-reload
systemctl enable backup.timer
systemctl start backup.timer

# Voir tous les timers
systemctl list-timers

# Prochain déclenchement
systemctl list-timers backup.timer

# Tester le service sans attendre
systemctl start backup.service
```

### Syntaxe OnCalendar

```bash
OnCalendar=daily              # chaque jour à minuit
OnCalendar=weekly             # chaque lundi à minuit
OnCalendar=Mon 09:00:00       # chaque lundi à 9h
OnCalendar=*:0/15             # toutes les 15 minutes
OnCalendar=2025-05-01 12:00   # date précise
OnCalendar=*-*-01 00:00:00    # 1er du mois

# Vérifier la syntaxe
systemd-analyze calendar "Mon *-*-* 09:00:00"
```

<Tip>
Les timers systemd sont préférables à cron pour les services car ils loguent dans journald, gèrent les dépendances et peuvent rattraper les exécutions manquées (`Persistent=true`). Cron reste plus simple pour les scripts ponctuels.
</Tip>
