Comment lister les processus de verrouillage de fichier?


51

En utilisant flockplusieurs processus, vous pouvez avoir un verrou partagé en même temps ou attendre l’acquisition d’un verrou en écriture. Comment puis-je obtenir une liste de ces processus?

C'est-à-dire que, pour un fichier X donné, l'idéal est de trouver l'ID de processus de chaque processus qui détient ou attend un verrou sur le fichier. Ce serait un très bon début, cependant, juste pour obtenir un décompte du nombre de processus en attente d'un verrou.

Réponses:


42

lslocks, du paquet util-linux , fait exactement cela.

Dans la MODEcolonne, les processus en attente d'un verrou seront marqués d'un *.


3
Apt-cache dit qu'util-linux est déjà la version la plus récente (2.20.1-1ubuntu3), mais je n'ai pas lslocks; Y a-t-il un repo que je peux utiliser pour me le donner?
Benubird

2
On dirait que cela a été ajouté dans la version 2.22, donc la version d'Ubuntu est trop ancienne. Vraisemblablement, une nouvelle version sera disponible par la suite. (C'est également le cas avec RHEL 6 ou CentOS.) Vous pouvez le construire vous-même ou utiliser l' lsofapproche proposée par Joel Davis.
Mattdm

6
lslockslit /proc/locks, vous pouvez le lire directement vous-même, avec l’avertissement que les fichiers sont identifiés par périphérique et inode plutôt que par nom. Puisque vous connaissez le fichier, cela ne devrait pas être un problème. Les entrées bloquées ont un ->préfixe avant la colonne de type verrou (ce qui ajoute une colonne à cette ligne).
mr.spuratic

27

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-expanatoire, mais lsofplace la description du verrou dans la colonne "FD" (ci- 10uWdessus). De 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.

La colonne "FD" lsofci - dessus se décompose ainsi:

10Le descripteur littéral de ce fichier ouvert. Qu'est-ce qui est lié à par/proc/1650/fd/10

u Le fichier est ouvert en lecture et en écriture

W programme a un verrou en écriture sur le fichier.


1
Je ne trouve pas où obtenir Lslk, et il semble ne plus être maintenu. Il convient également de noter que si vous voulez que lsof ne montre que les processus qui verrouillent réellement le fichier, vous devez utiliser grep pour "^ mutex". Il ne fait pas non plus la distinction entre "tenir" et "bloquer".
Benubird

Le caractère de première lettre du champ FD est le fichier avec lequel il a ouvert le fichier (je suppose que c'est ce que vous voulez dire en maintenant), le caractère de seconde lettre facultatif est le verrou (le cas échéant) qu'il a sur le fichier (que je m en supposant que c’est ce que vous entendez par "bloquer"). Aussi flock! = mutex. Votre grep aurait raté des verrous comme celui-ci dans le message (pour ne pas mentionner le premier champ est le nom du programme ...)
Bratchley

D'oh! Vous avez raison - "mutex" était le nom de mon script, donc grepping pour "mutex" ne s'applique qu'à mon cas. Merci de le signaler
Benubird

On dirait bien que j'ai fait un boo-boo aussi: "le caractère de la première lettre est le mode avec
lequel

5

lsof peut aider à voir la liste des fichiers. Voici un moyen de voir les fichiers verrouillés.

sudo lsof /var/lib/dpkg/lock 

0

dans le cas où lsofelle est absente du système, ls /proc/*/fd/* | grep LOCK_FILE_NAMEdevrait fournir les mêmes informations.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.