En utilisant flock
, plusieurs processus peuvent avoir un verrou partagé en même temps, ou être en attente d'acquérir un verrou en écriture. Comment obtenir une liste de ces processus?
C'est-à-dire, pour un fichier X donné, idéalement pour trouver l'ID de processus de chaque processus qui détient ou attend un verrou sur le fichier. Ce serait cependant un très bon début pour obtenir un décompte du nombre de processus en attente d'un verrou.
lslocks
, du paquet util-linux , fait exactement cela.
Dans la colonne MODE
, les processus en attente d'un verrou seront marqués d'un *
.
Deux possibilités: lsof
(ma préférence) ou lslk
(spécifiquement pour les verrous de fichiers):
[root@policyServer ~]# lslk | grep "master.lock"
SRC PID DEV INUM SZ TY M ST WH END LEN NAME
master 1650 253,0 12423 33 w 0 0 0 0 0 /var/lib/postfix/master.lock
[root@policyServer ~]# lsof | grep "master.lock"
master 1650 root 10uW REG 253,0 33 12423 /var/lib/postfix/master.lock
La sortie de lslk est auto-expansive mais lsof
place la description du verrou dans la colonne "FD" (qui est 10uW
au dessus de). Depuis la page de manuel:
The mode character is followed by one of these lock characters, describing the type of lock applied to the file:
N for a Solaris NFS lock of unknown type;
r for read lock on part of the file;
R for a read lock on the entire file;
w for a write lock on part of the file;
W for a write lock on the entire file;
u for a read and write lock of any length;
U for a lock of unknown type;
x for an SCO OpenServer Xenix lock on part of the file;
X for an SCO OpenServer Xenix lock on the entire file;
space if there is no lock.
Ainsi, la colonne "FD" de lsof
ci-dessus se décompose en:
10
Le descripteur littéral de ce fichier ouvert. À quoi est lié par /proc/1650/fd/10
u
Le fichier est ouvert pour la lecture et l'écriture
W
programme a un verrou en écriture sur le fichier.
lsof peut aider à voir la liste des fichiers. voici comment voir les fichiers verrouillés.
Sudo lsof /var/lib/dpkg/lock
dans le cas où lsof
lui-même est manquant sur le système, ls /proc/*/fd/* | grep LOCK_FILE_NAME
devrait fournir les mêmes informations.