¿Cómo identificar el proceso bloqueando un archivo?

35

Quiero saber el proceso exacto que está usando el archivo de bloqueo. No quiero arreglarlo , pero solo para saber qué está haciendo mi sistema. ¿Cómo puedo averiguarlo?

Por ejemplo, este mensaje:

E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?

Nuevamente, solo quiero identificar el proceso que lo usa, no cómo solucionarlo.

Braiam
fuente

Respuestas:

38

Hay lo infame lsof:

sudo lsof /var/lib/dpkg/lock
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
aptitude 4974 root    3uW  REG   8,23        0 815673 /var/lib/dpkg/lock

En este caso aptitude está usando el archivo. Debe usar root en caso de que no esté seguro de qué usuario está bloqueando el archivo. También es útil para muchas cosas, lamentablemente no viene instalado con Ubuntu, por lo que debe instalarlo primero.

Para el resto de los mortales, está el fusercomando. Esto es peculiar ya que solo devuelve el PID en lugar del nombre del proceso:

➜  ~  sudo fuser /var/lib/dpkg/lock
/var/lib/dpkg/lock:   4974

Aquí dice que el archivo y el PID, que es 4974, por lo que debemos investigar quién es:

➜  ~  ps 4974
  PID TTY      STAT   TIME COMMAND
 4974 pts/1    Sl+    0:06 aptitude
Braiam
fuente
66
¿Por qué es lsofinfame? ¿Hay algunos problemas con eso?
Ruslan
3
@Ruslan Sí, permite a los usuarios despistados saber el uso real de los sistemas, contrario a lo que quieren los administradores de sistemas ...
Braiam
@Braiam ¿Demasiada información puede ser peligrosa, en las manos adecuadas? ^ -_- ^
Peter David Carter
Segunda opción en una línea:ps $(sudo fuser /var/lib/dpkg/lock)
wjandrea
8

lslocks es una forma simple de hacerlo.

lslocks |grep /var/lib/dpkg/lock

Para usar shell para manejar la identificación del proceso:

for pid in `lslocks -rn | grep /var/lib/dpkg/lock|awk '{print $2}'`;
do 
    echo $pid; 
done
jolestar
fuente
Sí. lslockses la mejor manera de hacerlo. Utilizando lsofme dio este error: "lsof: ADVERTENCIA: no puede stat () del sistema de archivos fuse.gvfsd-fusible / run / usuario / 1000 / gvfs información de salida puede ser incompleta"
Nav
@Nav eso no es un error, sino una ADVERTENCIA.
Braiam