Lorsque plusieurs instances d’un même script Bash s’exécutent en parallèle, des problèmes de concurrence (race conditions) peuvent vite apparaître : écriture simultanée dans un fichier journal, exécution en double d’une tâche d’arrière-plan ou saturation des ressources système.
Pour éviter qu’un script ne s’exécute deux fois en même temps (notamment dans une tâche cron), la commande flock est la solution idéale sous Linux.
Comment fonctionne flock ?
flock repose sur des verrous au niveau du système de fichiers (file locks). Tant qu’un processus détient le verrou sur un fichier spécifique, aucun autre processus ne peut obtenir ce même verrou.
1. Empêcher l’exécution simultanée d’un script
Le cas d’usage le plus courant consiste à utiliser flock pour encapsuler l’appel d’un script.
Bash
flock -n /tmp/mon_script.lock /chemin/vers/mon_script.sh
-n(non-blocking) : si le verrou est déjà pris par une autre instance,flocks’arrête immédiatement sans exécuter la commande.- /tmp/mon_script.lock : le fichier qui sert de témoin de verrouillage.
Gestion des verrous à l’intérieur d’un script
Il est également possible d’intégrer flock directement dans le script lui-même pour qu’il gère son propre verrouillage dès le démarrage.
Bash
#!/usr/bin/env bash
exec 200>/var/run/mon_script.lock
flock -n 200 || { echo "Une autre instance est déjà en cours d'exécution." ; exit 1 ; }
# Votre logique de script ici
echo "Traitement en cours..."
sleep 10
Explication du fonctionnement :
exec 200>/var/run/mon_script.lockouvre le fichier sur le descripteur de fichier200.flock -n 200essaie d’acquérir le verrou sur ce descripteur.- Si l’acquisition échoue, le script affiche un message et s’arrête proprement.
- À la fin du script (ou en cas de crash), le descripteur est fermé et le verrou est automatiquement libéré par le noyau.
Les options indispensables
| Option | Description |
-n (--nonblock) | Échoue immédiatement si le verrou n’est pas disponible (par défaut, flock attend qu’il se libère). |
-u (--unlock) | Libère explicitement le verrou (rarement nécessaire car géré à la fermeture du processus). |
-w <secondes> | Attend un temps défini pour obtenir le verrou avant d’abandonner. |
-s (--shared) | Pose un verrou partagé (lecture seule autorisée pour plusieurs processus). |
-x (--exclusive) | Pose un verrou exclusif (comportement par défaut). |
Pourquoi préférer flock à un simple fichier .pid ?
La création manuelle d’un fichier temporaire (ex. touch /tmp/script.lock) pose problème en cas de plantage ou de coupure de courant : le fichier reste sur le disque et bloque les exécutions futures.
flock résout ce problème car le verrou est géré par le noyau Linux et lié au processus en cours. Si le processus meurt, le verrou saute immédiatement.

