¿Cómo enumerar los procesos de bloqueo de archivos?

51

Utilizando flock, varios procesos pueden tener un bloqueo compartido al mismo tiempo, o estar esperando adquirir un bloqueo de escritura. ¿Cómo obtengo una lista de estos procesos?

Es decir, para un archivo X dado, idealmente para encontrar la identificación del proceso de cada proceso que contiene o está esperando un bloqueo en el archivo. Sin embargo, sería un buen comienzo solo para contar el número de procesos que esperan un bloqueo.

Benubird
fuente

Respuestas:

42

lslocks, desde el paquete util-linux , hace exactamente esto.

En la MODEcolumna, los procesos que esperan un bloqueo se marcarán con un *.

mattdm
fuente
3
Apt-cache dice que util-linux ya es la versión más nueva (2.20.1-1ubuntu3), pero no tengo lslocks; ¿Hay un repositorio que pueda usar que me lo dé?
Benubird
2
Parece que esto se agregó en 2.22, por lo que la versión de Ubuntu es demasiado antigua. Presumiblemente, una nueva versión estará disponible eventualmente. (Este también es el caso con RHEL 6 o CentOS.) Puede construirlo usted mismo, o puede usar el lsofenfoque que sugiere Joel Davis.
mattdm
66
lslockslee /proc/locks, en un apuro puedes leer eso directamente tú mismo, con la advertencia de que los archivos se identifican por dispositivo e inodo en lugar de nombre. Como conoce el archivo, eso no debería ser un problema. Las entradas bloqueadas tienen un ->prefijo antes de la columna de tipo de bloqueo (agregando así una columna a esa línea).
Sr.Spuratic
27

Dos posibilidades: lsof(mi preferencia) o lslk(específicamente para bloqueos de archivos):

[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 salida de lslk es autoexpansiva pero lsofcoloca la descripción del bloqueo en la columna "FD" (que está 10uWarriba). Desde la página del manual:

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.

Entonces la columna "FD" de lsofarriba se desglosa en:

10El descriptor literal de este archivo abierto. ¿A qué está vinculado?/proc/1650/fd/10

u El archivo está abierto para leer y escribir.

W El programa tiene un bloqueo de escritura en el archivo.

Bratchley
fuente
1
No puedo encontrar dónde obtener lslk, y parece que ya no se mantiene. También vale la pena señalar que si desea que lsof solo muestre los procesos que realmente están bloqueando el archivo, debe buscar "^ mutex". Tampoco distingue entre 'retención' y 'bloqueo'.
Benubird
El primer carácter de letra del campo FD es el archivo con el que tiene abierto el archivo (supongo que eso es lo que quiere decir con mantener presionado) el segundo carácter de letra opcional es el bloqueo (si lo hay) que tiene en el archivo (que yo ' Supongo que es lo que quiere decir con "bloqueo") También flock! = mutex. Su grep habría perdido bloqueos como el de la publicación (sin mencionar que el primer campo es el nombre del programa ...)
Bratchley
D'oh! Tienes razón: "mutex" era el nombre de mi script, por lo que buscar "mutex" solo es aplicable a mi caso. Gracias por señalarlo
Benubird
bien parece que hice un boo-boo también: "el primer carácter de letra es el modo con el que tiene el archivo abierto con ..."
Bratchley
5

lsof puede ayudar a ver la lista de archivos. Aquí hay forma de ver los archivos bloqueados.

sudo lsof /var/lib/dpkg/lock 
Hafiz Shehbaz Ali
fuente
0

en caso de lsofque falte en el sistema, ls /proc/*/fd/* | grep LOCK_FILE_NAMEdebe proporcionar la misma información.

PypeBros
fuente