Tener un archivo abierto no es un bloqueo porque, si cada proceso tiene que verificar si el archivo está abierto primero y no proceder si lo está, o crearlo / abrirlo si no lo está, entonces dos procesos podrían verificar simultáneamente, ambos encontrarán que no está abierto, entonces ambos lo crean o lo abren.
Para usar un archivo como bloqueo, la operación de verificación y bloqueo debe ser una operación única e 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á la comprobación y el 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 utilizando umask
una configuración por proceso que establece los permisos con los que se crean nuevos archivos:
oldumask = $ (umask)
umask 222 # también crea archivos que no se pueden escribir para el propietario
si echo $$> / var / lock / foo
entonces
: bloqueo exitoso
más
: bloqueo fallido
fi
umask $ oldumask
Esto también escribe el proceso de propiedad 'PID en el archivo, 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 desea 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
/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$'