2010-01-19 16:08:15 +0000 2010-01-19 16:08:15 +0000
127
127

¿Cómo puedo determinar qué proceso tiene un archivo abierto en Linux?

Me gustaría determinar qué proceso tiene la propiedad de un archivo de bloqueo. Los archivos de bloqueo son simplemente un archivo con un nombre específico que ha sido creado.

Entonces, ¿cómo puedo determinar qué proceso tiene abierto un archivo en particular en Linux? Preferiblemente un tipo de una línea o una solución de herramienta de Linux en particular sería óptimo.

Respuestas (4)

146
146
146
2010-01-19 16:18:03 +0000

En la mayoría de los sistemas Linux lsof NAME hace el trabajo:

fin@r2d2:~$ lsof /home/fin
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
bash 21310 fin cwd DIR 8,1 4096 5054467 /home/fin
lsof 21320 fin cwd DIR 8,1 4096 5054467 /home/fin
lsof 21321 fin cwd DIR 8,1 4096 5054467 /home/fin
fin@r2d2:~$
56
56
56
2010-01-19 17:37:11 +0000

También puedes usar fuser para esto:

~> less .vimrc
# put in background
~> fuser .vimrc
.vimrc: 28135
~> ps 28135
  PID TTY STAT TIME COMMAND
28135 pts/36 T 0:00 less .vimrc
9
9
9
2010-01-20 13:14:12 +0000

Tener un archivo abierto no es un bloqueo porque, si cada proceso tiene que comprobar primero si el archivo está abierto y no proceder si lo está o crearlo/abrirlo si no lo está, entonces dos procesos podrían muy bien comprobar simultáneamente, ambos encuentran que no está abierto, entonces ambos lo crean o lo abren.

Para usar un archivo como un bloqueo, la operación de comprobación y bloqueo tiene que ser una sola operación ininterrumpida. Puede lograrlo en un sistema de archivos Unix creando un archivo con modo de sólo lectura y eliminándolo para desbloquearlo. Si el archivo existe (y es de sólo lectura) la creación del archivo fallará, por lo que obtendrá el check-and-lock en una sola operación atómica.

Si su proceso de bloqueo es un script de shell que se ejecutará como un demonio, puede obtener este efecto usando umask, una configuración por proceso que establece los permisos con los que se crean los nuevos archivos:

oldumask=$(umask) umask 222 # create files unwritable to owner too if echo $$ \> /var/lock/foo then : locking succeeded else : locking failed fi umask $oldumask

Esto también escribe el PID del proceso propietario en el archivo, lo que resuelve su otro problema: cat /var/lock/foo


En cuanto a la pregunta específica “¿Qué procesos tienen abierto este archivo? ”, esto puede ser útil cuando usted quiere desmontar un sistema de archivos pero no puede porque algún proceso tiene un archivo abierto en él. Si no tiene esos comandos disponibles, puede preguntar a /proc como root:

ls -l /proc/*/cwd | grep '/var/lock/foo$'

o, como usuario mortal:

ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'

2
2
2
2015-10-30 14:21:35 +0000

Encontré que al usar la respuesta aceptada no enumeraba los procesos que estaban usando mi directorio ( ubuntu 14.04 ).

Al final, usé lsof (listar archivos abiertos) y salté su salida para encontrar el proceso ofensivo:

lsof | egrep "<regexp-for-your-file>"