¿Cómo pasar la salida de grep a "lsof -p"?

¿Cómo pasar la salida de grep a "lsof -p"?

Quiero saber el camino que se está ejecutando actualmente../a.out

Hay varios procesos MPI, pero solo necesito uno de los PID de varios ./a.out. Así que primero uso el siguiente código para buscarlo:

ps aux | grep -P "Rl.*a\.out" | grep -oP "\d+"|head -n 1

lo que da un PID, por ejemplo 12345.

Ahora quiero usar:

lsof -p12345 

Para conocer la ruta del archivo de PID 12345.

¿Cómo combinar los dos pasos en una sola línea de comando?

Respuesta1

Este es el comando que necesitas:

ps aux|grep -P "Rl.*a\.out"|grep -oP "\d+"|head -n 1 | xargs lsof -p

La clave aquí es xargs.

Comandos como grepy awkpueden aceptar elentrada estándar(STDIN) como parámetro o argumento mediante el uso de una tubería. Sin embargo, otros como cpy ignoran el flujo de entrada estándar y se basan únicamente en echoellsofargumentosencontrado después del comando.

Usando el comandoxargspuede crear y ejecutar líneas de comando desde la entrada estándar.

Respuesta2

Recomendaría usarlo xargscuando un comando devuelva varias líneas (o registros). En este caso, el comando devuelve un único PID y una función de shell conocida comosustitución de comandosería una solución adecuada.

Esto permite que otro use la salida de un comando y se logra envolviendo el comando que proporciona la entrada en $(y ). En el pasado se utilizaban comillas invertidas (`), pero ya no se recomiendan.

lsof -p $(ps aux|grep -P "Rl.*a\.out"|grep -oP "\d+"|head -n 1)

Respuesta3

Su primer comando complejo para encontrar el PID según el nombre se puede reemplazar por pgrep, por ejemplo

$ pgrep -nf a.out
70512

Luego, para obtener la ruta desde lsof, puede utilizar la impresión condicional en awk.

Entonces el comando podría ser:

$ lsof -p $(pgrep -nf a.out) | awk '$4 == "cwd" {print $9}'

Lo anterior se basa en el siguiente lsofresultado:

$ lsof -p $(pgrep -nf a.out)
COMMAND   PID   USER   FD   TYPE DEVICE  SIZE/OFF      NODE NAME
gsleep  70513 kenorb  cwd    DIR    1,4      1938 121793972 /my/path

información relacionada