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 se ha creado.
Entonces, ¿cómo puedo determinar qué proceso tiene un archivo en particular abierto en Linux? Preferiblemente, un tipo de línea única o una solución de herramienta Linux particular sería óptima.
if [
fusor "$ archivo" `]; entonces exit`ls
sigue: devuelve el código de salida 2 si hay un error (por ejemplo, una opción no válida especificada) o un archivo no encontrado (y 0 si informa con éxito la información).En la mayoría de los sistemas Linux
lsof NAME
hace el trabajo:fuente
cwd
líneas (que informan el uso como el directorio de trabajo actual de un proceso) solo informan directorios.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
Esto también escribe el proceso de propiedad 'PID en el archivo, que resuelve su otro problema:umask
una configuración por proceso que establece los permisos con los que se crean nuevos archivos: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$'
fuente
Si desea saber qué descriptor de archivo de proceso exacto se vincula a su archivo sin
lsof
ofuser
- busque a través de/proc
:Reemplace
$1
con el nombre de archivo abierto que está buscando. Puede modificar el-printf
para lo que quiera ver, o canalizaregrep -o '[0-9]+' | head -1
para usar con la información de ese proceso.ps -Fp <pid>
La respuesta de @fin es la mejor respuesta, obviamente, pero para responder el comentario de @ JoseLSegura , si esto no está disponible, la solución anterior fue mi respuesta.
$ lsof <filename>
fuente
Descubrí que usar la respuesta aceptada no enumeraba los procesos que estaban usando mi directorio (ubuntu 14.04).
Al final, utilicé lsof (enumerar archivos abiertos) y agarré su salida para encontrar el proceso ofensivo:
fuente
lsof
es su opción-R
. por ejemplo:lsof -R [filename]