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