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
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.
find
comando conps
?