2010-03-26 8 views
6

Estoy tratando de probar un solo archivo si está abierto usando lsof. ¿Hay una manera más rápida que esto?¿Cuál es la forma más rápida de usar un único archivo abierto?

$result = exec('lsof | grep filename | wc -l'); 

if($result > 0) { 
    //file is open 
} 

Estoy pensando que deben ser una forma de simplemente probar un archivo si conoce el nombre del archivo. Todo lo que realmente necesito es verdadero o falso.

Respuesta

9

Encontré una manera mucho mejor. Con lsof (probado en la versión 4.63), se puede consultar directamente en un archivo específico:

if lsof filename > /dev/null; then 
    # file is open 
fi 
2

Bueno, puede omitir wc y utilizar el valor de retorno de grep (grep devuelve 0 (es decir, el éxito) si detecta el patrón y 1 (es decir, no-éxito) si no detecta el patrón):

if lsof | grep filename > /dev/null; then 
    # filename is in output of lsof 
fi 

puede mejorar esto un poco mediante el uso de la bandera de grep -l:

if lsof | grep -l filename > /dev/null; then 
... 

esto le dice a grep para dejar de buscar una vez que detecta que es el primer partido.

+0

Si realmente te importa el proceso que está usando el archivo, mejor utilizar la opción '-m 1' para grep, así que obtienes la línea correspondiente en lugar del nombre de archivo (stdin) en que se encontró la coincidencia. buen uso alternativo de '-l'.) – Cascabel

1

Uso fuser. Devuelve un valor distinto de cero si alguno de los archivos especificados está en uso, y cero si están todos disponibles.

1

No. La respuesta podría cambiar cuando trates de hacer algo con el resultado. En su lugar, intente hacer lo que sea que desee hacer con el archivo y manejar el error "en uso" o "violación de uso compartido".

+0

Para ti: +1, por lo que estoy viendo, creo que tienes razón. Aunque su respuesta no responde específicamente la pregunta. – jjclarkson

+0

Jared Parsons tiene un bonito informe sobre por qué la pregunta en sí misma es fundamentalmente defectuosa: http://blogs.msdn.com/jaredpar/archive/2009/12/10/the-file-system-is-unpredictable.aspx En tales casos, es mejor no responder la pregunta que se le hizo, sino la pregunta que SE DEBERÍA haber hecho. –

+0

-1 por un par de razones. En primer lugar, la respuesta "do not" es * también * ingenua y equivocada. Hay varios motivos legítimos para querer consultar directamente si los archivos están abiertos o si se mantienen bloqueos de aviso, como la depuración, la supervisión o la advertencia a un usuario de antemano de que es posible que no pueda guardar sus cambios. En segundo lugar, los punteros de archivo en Unix no imponen ningún tipo de bloqueo por defecto; a menos que use explícitamente 'flock' o algún otro mecanismo de bloqueo, no * obtendrá * ningún error de" uso "o" violación de uso compartido "; simplemente distorsionará alegremente su archivo. –

Cuestiones relacionadas