
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 grep
y awk
pueden aceptar elentrada estándar(STDIN) como parámetro o argumento mediante el uso de una tubería. Sin embargo, otros como cp
y ignoran el flujo de entrada estándar y se basan únicamente en echo
ellsof
argumentosencontrado después del comando.
Usando el comandoxargs
puede crear y ejecutar líneas de comando desde la entrada estándar.
Respuesta2
Recomendaría usarlo xargs
cuando 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 lsof
resultado:
$ 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