¿Cómo obtener el nombre del archivo de proceso de PID en MacOS?

13

¿Es posible obtener el nombre de archivo de un proceso usando PID? ps muestra mucha información útil sobre un proceso, pero no una pista sobre la ubicación del archivo ejecutable de un proceso.

grigoryvp
fuente

Respuestas:

13

Una forma de obtener la ubicación binaria del proceso es usar lsofy greppara el primer txtsegmento. Por ejemplo, en el shell para ver qué binario es el shell, use el PID del shell en lugar de $$.

$ lsof -p $$ | grep txt
bash    78228 blair  txt    REG   14,2   1244928   6568359 /bin/bash
bash    78228 blair  txt    REG   14,2   1059792  23699809 /usr/lib/dyld
bash    78228 blair  txt    REG   14,2 136368128  81751398 /private/var/db/dyld/dyld_shared_cache_i386

Puedes ver que el shell está usando /bin/bash.

Esta técnica funciona si el proceso se inició utilizando una ruta absoluta o relativa. Por ejemplo, entrar en un shell y ejecutar

$ sleep 1234567

y usar psen otro shell solo muestra cómo se lanzó:

$ ps auxww|grep '[s]leep'
blair    79462   0.0  0.0   600908    744 s011  S+   11:17PM   0:00.00 sleep 1234567

usando lsofmuestra qué binario se ejecutó:

$ lsof -p 79462 | awk '$4 == "txt" { print $9 }'
/opt/local-development/bin/gsleep

Tengo MacPorts coreutils + with_default_names instalado, lo que explica que recogí gsleepy no /bin/sleep.

Blair Zajac
fuente
La canalización de salida de lsof a través de awk funciona muy bien, con una pequeña adición. Agregué ; exitdespués de la declaración de impresión para que solo se imprima la primera txtentrada, incluso si hay varias como en el ejemplo bash.
qqx
2

Ejemplo: busca el nombre del comando de proceso asociado para PID 45109...

>    % ps awx | awk '$1 == 45109 { print $5 }'
>    /Applications/Safari.app/Contents/MacOS/Safari
Jerjes
fuente
2
No mostrará la ruta binaria completa si la binaria se inició solo por su nombre sin especificar la ruta.
grigoryvp
no funciona bien, si la ruta contiene espacios en blanco
Peter Lapisu
1

prueba ps aux

vu1tur
fuente
1

ps -ef con grep funciona para mí. Para un nombre de archivo específico, simplemente canalice grep así:

MacBook:~ Me$ ps -ef | grep Safari | grep -v grep
  501 15733   301   0   0:25.76 ??         1:58.24 /Applications/Safari.app/Contents/MacOS/Safari -psn_0_4977855

(Ese último 'grep -v grep' simplemente evita que obtenga su propio comando grep en la salida)

HappySpaceInvader
fuente
1

ps -p <pid> -Ocomando

L1A1:~ a1155344$ ps -p1 -Ocommand
  PID   TT  STAT      TIME COMMAND
    1   ??  Ss     0:02.26 /sbin/launchd
Jason Tan
fuente