GNU/Linux >> Tutoriales Linux >  >> Linux

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

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

[email protected]:~$ 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
[email protected]:~$

También puedes usar fuser por 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

Tener un archivo abierto no es un bloqueo porque, si cada proceso tiene que verificar si el archivo está abierto primero y no continuar si lo está o crearlo/abrirlo si no lo está, entonces dos procesos podrían verificar simultáneamente, ambos encuentran que no está abierto, entonces créelo o ábralo.

Para utilizar un archivo como bloqueo, la operación de verificación y bloqueo debe ser una sola operación ininterrumpida. Puede lograr esto en un sistema de archivos Unix creando un archivo con modo de solo lectura y eliminándolo para desbloquearlo. Si el archivo existe (y es de solo lectura), la creación del archivo fallará, por lo que obtendrá verificación y bloqueo 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 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 Con respecto a la pregunta específica "¿Qué procesos tienen este archivo abierto?", esto puede ser útil cuando desea desmontar un sistema de archivos pero no puede porque algún proceso tiene un archivo abierto. Si no tiene esos comandos disponibles, puede preguntar /proc como raíz:

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

o, como usuario mortal:

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


Linux
  1. ¿Cómo crear, extraer o abrir un archivo RAR en Linux?

  2. ¿Cómo averiguo qué proceso tiene un bloqueo en un archivo en Linux?

  3. ¿Cómo puedo vincular un archivo en Linux?

  4. ¿Cómo puedo crear un archivo tar de varias partes en Linux?

  5. ¿Cómo se determina qué tipo de zócalo de CPU tiene una computadora Linux?

Cómo abrir un archivo en Linux

Cómo determinar el tipo MIME de un archivo en Linux

Cómo cambiar el límite de archivos abiertos en Linux

¿Qué son los enlaces simbólicos en Linux? ¿Cómo crear enlaces simbólicos?

Cómo usar el comando lsof en Linux

¿Cómo saber qué proceso tiene abierto un puerto específico en Linux?