flock - Gérer des verrous depuis des scripts
d'interpréteur
flock [options] fichier|répertoire
commande [arguments]
flock [options] fichier|répertoire
-c commande
flock [options] numéro
Cet utilitaire gère les verrous flock(2) à
partir de scripts d’interpréteur ou de la ligne de
commande.
Les première et deuxième formes
précédentes enveloppent l’exécution d’une
commande par un verrou, de façon similaire à
su(1) ou newgrp(1). Elles verrouillent soit le fichier,
soit le répertoire indiqué, qui est créé
(en supposant que vous ayez les droits adéquats) s’il
n’existe pas déjà. Par défaut, si le verrou ne
peut pas être obtenu immédiatement, flock attend
jusqu’à ce que le verrou soit disponible.
La troisième forme utilise un fichier ouvert par son
numéro de descripteur de fichier. Consultez les exemples
suivants montrant comment l’utiliser.
-c, --command commande
Passer une seule commande, sans argument, à
l’interpréteur de commandes avec -c.
-E, --conflict-exit-code numéro
Le code de retour utilisé quand l’option
-n est utilisée et que le verrou en conflit existe, ou que
l’option -w est utilisée et que le délai est
atteint. La valeur par défaut est 1. Le nombre doit
être compris entre 0 et 255.
-F, --no-fork
Ne pas forker avant d’exécuter
commande. Pendant l’exécution, le processus flock
est remplacé par commande qui garde le verrou. Cette option est
incompatible avec --close, sans quoi plus rien ne conserverait le
verrou.
-e, -x, --exclusive
Obtenir un verrou exclusif, parfois appelé verrou
en écriture. C’est l’option par défaut.
-n, --nb, --nonblock
Échouer plutôt qu’attendre si le
verrou ne peut pas être obtenu immédiatement. Consultez
l’option -E pour le code de retour utilisé.
-o, --close
Fermer le descripteur de fichier sur lequel le verrou est
maintenu avant l’exécution de commande. C’est
utile si commande lance un processus enfant qui ne devrait pas
détenir le verrou.
-s, --shared
Obtenir un verrou partagé, parfois appelé
verrou en lecture.
-u, --unlock
Supprimer un verrou. Ce n’est
généralement pas nécessaire, puisqu’un verrou est
automatiquement supprimé lorsque le fichier est fermé.
Cependant, il peut être nécessaire dans des cas particuliers,
par exemple si le groupe de commandes inclus a engendré un processus en
arrière-plan qui ne devrait pas détenir le verrou.
-w, --wait, --timeout délai
Échouer si le verrou ne peut pas être
obtenu en délai secondes. Les valeurs en fractions
décimales sont permises. Consultez l’option -E pour le
code de retour utilisé. Un délai nul est
interprété comme --nonblock.
--verbose
Renvoyer la durée d’acquisition du verrou
ou la raison pour laquelle il n’a pas pu être obtenu.
-h, --help
Afficher l’aide-mémoire puis quitter.
-V, --version
Afficher le numéro de version et quitter.
La commande utilise les valeurs de code de retour de
<sysexits.h> pour tout, sauf avec les options -n ou -w,
qui signalent un échec d’obtention du verrou avec un code de
retour donné par l’option -E, ou avec 1 par
défaut. Le code de retour donné par -E doit être
0 et 255.
En utilisant la variante commande et si
l’exécution de l’enfant a fonctionné, le code de
retour est celui de la commande enfant.
flock does not detect deadlock. See flock(2) for
details.
Some file systems (e. g. NFS and CIFS) have a limited
implementation of flock(2) and flock may always fail. For details see
flock(2), nfs(5) and mount.cifs(8). Depending on mount
options, flock can always fail there.
Notez que « shell> » dans les
exemples ci-dessous est une invite de commande.
shell1> flock /tmp -c cat; shell2> flock -w .007 /tmp -c
echo; /bin/echo $?
Set exclusive lock to directory /tmp and the
second command will fail.
shell1> flock -s /tmp -c cat; shell2> flock -s -w .007 /tmp
-c echo; /bin/echo $?
Set shared lock to directory /tmp and the second
command will not fail. Notice that attempting to get exclusive lock with
second command would fail.
shell> flock -x fichier_verrou_local echo 'a b c'
Récupérer le verrou exclusif
« fichier_verrou_local » avant
d’exécuter echo 'a b c'.
(; flock -n 9 || exit 1; # ... commandes exécutées
sous un verrou ...; ) 9>/var/lock/mon_fichier_verrou
Cette forme est pratique dans les scripts
d’interpréteur de commandes. Le mode utilisé pour ouvrir
le fichier n’est pas important pour flock ; utiliser
> ou >> permet de créer le fichier de
verrouillage s’il n’existe pas déjà, cependant, le
droit d’écriture est nécessaire. En utilisant
<, le fichier doit déjà exister, mais seul le droit de
lecture est nécessaire.
[ "${FLOCKER}" != "$0" ] && exec env
FLOCKER="$0" flock -en "$0" "$0"
"$@" || :
This is useful boilerplate code for shell scripts. Put it
at the top of the shell script you want to lock and it’ll automatically
lock itself on the first run. If the environment variable $FLOCKER is
not set to the shell script that is being run, then execute flock and
grab an exclusive non-blocking lock (using the script itself as the lock file)
before re-execing itself with the right arguments. It also sets the
FLOCKER environment variable to the right value so it doesn’t
run again.
shell> exec 4<>/var/lock/mon_fichier_verrou; shell>
flock -n 4
This form is convenient for locking a file without
spawning a subprocess. The shell opens the lock file for reading and writing
as file descriptor 4, then flock is used to lock the descriptor.
H. Peter Anvin <hpa@zytor.com>
Copyright © 2003-2006 H. Peter Anvin. C’est un
logiciel libre ; consultez les sources pour les conditions de copie.
Il n’y a AUCUNE garantie ; même pas de VALEUR MARCHANDE
ou d’ADÉQUATION À UNE UTILISATION
PARTICULIÈRE.
Pour signaler un bogue, utilisez le gestionnaire de bogues sur
<https://github.com/util-linux/util-linux/issues>.
La commande flock fait partie du paquet util-linux, elle
est disponible sur l’archive du noyau Linux
<https://www.kernel.org/pub/linux/utils/util-linux/>.