Algo como esto:

PID = 3187: / home / morganc / test1.out

¿Cómo uso el comando de búsqueda para que muestre el número PID de mi archivo test1.out así como el directorio donde ¿Se encuentra?

Gracias de antemano.

Comentarios

  • ¿Está seguro de que no está confundiendo find comando con ps?
  • Si el proceso que creó o tiene el archivo abierto todavía se está ejecutando, la respuesta de Gilles funcionará. Si el proceso que creó el archivo ya no se está ejecutando, entonces no hay forma de averiguar qué sucedió en el pasado.
  • ¿Cómo obtuvo su archivo un PID?

Respuesta

Puede probar 2 soluciones:

fuser /path/to/opened/file 

o

lsof /path/to/opened/file 

Respuesta

Si usted es el propietario del proceso que creó o tiene el archivo abierto, usted puede hacer

ls -o /proc/*/fd 2> /dev/null 

que enumerará todos los archivos para PID para su ID de usuario; si no tiene muchos procesos en ejecución, solo mire manualmente la salida. Ejemplo: buscando un proceso que tenga vmstat.out abierto:

mark (/home/mark)> ls -l /proc/*/fd 2> /dev/null /proc/27669/fd: total 0 lrwx------. 1 mark mark 64 Feb 13 19:51 0 -> /dev/pts/0 lrwx------. 1 mark mark 64 Feb 13 19:51 1 -> /dev/pts/0 lrwx------. 1 mark mark 64 Feb 13 19:53 10 -> /dev/pts/0 lr-x------. 1 mark mark 64 Feb 13 19:53 12 -> /home/mark l-wx------. 1 mark mark 64 Feb 13 19:51 2 -> /dev/null lrwx------. 1 mark mark 64 Feb 13 19:53 4 -> /home/mark/.sh_history /proc/27737/fd: total 0 lrwx------. 1 mark mark 64 Feb 13 19:53 0 -> /dev/pts/0 lrwx------. 1 mark mark 64 Feb 13 19:53 1 -> /dev/pts/0 lrwx------. 1 mark mark 64 Feb 13 19:53 2 -> /dev/pts/0 lr-x------. 1 mark mark 64 Feb 13 19:53 3 -> /home/oracle/log/vmstat.out lr-x------. 1 mark mark 64 Feb 13 19:53 4 -> anon_inode:inotify 

Entonces, PID 27737 tiene el archivo vmstat.out abierto y la ruta completa es /home/oracle/log/vmstat.out

Si desea filtrar la mayor parte del resultado, intente esto:

mark (/home/oracle/log)> ls -l /proc/*/fd 2> /dev/null | grep -E "(^/proc|vmstat.out)" /proc/27669/fd: /proc/27943/fd: lr-x------. 1 mark mark 64 Feb 13 20:00 3 -> /home/oracle/log/vmstat.out /proc/28047/fd: /proc/28048/fd: /proc/self/fd: mark (/home/oracle/log)> 

Y luego busque el PID justo encima del archivo de interés.

Entonces, para ignorar los otros procesos, conecté a awk, guardé la línea anterior e imprimí la línea anterior cuando encontré que la línea actual comenzaba con un l:

ls -l /proc/*/fd 2> /dev/null | \ grep -E "(^/proc|vmstat.out)" | \ awk "BEGIN { prev = $0} /proc/ { prev = $0 } /^l/ { print prev $NF }" /proc/27943/fd:/home/oracle/log/vmstat.out 

Respuesta

Según sobre cómo interpreto su pregunta (ver comentarios), su solución sería:

find $root_dir -name $file_name -exec pidof {} \; 

o:

find $root_dir -name $file_name -exec fuser {} \; 

Donde define la variable $root_dir como el directorio de inicio debajo del cual desea para realizar tu búsqueda, y $file_name como el nombre del archivo que estás buscando.

La primera alternativa si es para el caso de buscar un archivo ejecutable en ejecución, y la segunda alternativa es para el caso de un archivo de datos ejecutado por un ejecutable.

Para probar esto (para la primera alternativa), abrí un archivo usando el less, presionó C-z para detenerlo y ponerlo en segundo plano, y ejecutó find /usr/bin -name less -exec pidof {} \;. Para probar la segunda alternativa, creé un archivo de datos ~/test.txt, ejecuté less ~/test.txt, luego C-z, seguido de find ~ -name test.txt -exec fuser {} \;.

Comentarios

  • ¿Y si hay 20 personas corriendo less en ese momento? Creo que el OP quiere buscar un nombre de archivo de salida.
  • Entendí que la pregunta era una búsqueda para el uso de un ejecutable, no un archivo de datos, por lo que en su caso, obtendría veinte pids y un solo camino. Sin embargo, veo cómo está interpretando la pregunta de manera diferente, así que ' agregaré una segunda solución en mi respuesta para cubrir su caso, gracias.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *