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 $oldumaskEsto 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$'