jak uzyskać nazwę pliku procesu z PID w MacOS?

13

Czy można uzyskać nazwę pliku procesu za pomocą PID? ps wyświetla wiele przydatnych informacji o procesie, ale nie podpowiedź na temat lokalizacji pliku wykonywalnego procesu.

grigoryvp
źródło

Odpowiedzi:

13

Jednym ze sposobów uzyskania binarnej lokalizacji procesu jest użycie lsofi grepdla pierwszego txtsegmentu. Na przykład w powłoce, aby zobaczyć, co to jest plik binarny, użyj zamiast identyfikatora PID powłoki $$.

$ 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

Widać, że używa powłoki /bin/bash.

Ta technika działa, jeśli proces został uruchomiony przy użyciu ścieżki bezwzględnej lub względnej. Na przykład przejście do jednej powłoki i uruchomienie

$ sleep 1234567

a użycie psw innej powłoce pokazuje tylko, jak zostało uruchomione:

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

za pomocą lsofprogramów, które uruchomił binarny:

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

Mam zainstalowane MacPorts coreutils + with_default_names, co wyjaśnia, że ​​wziąłem gsleepi nie /bin/sleep.

Blair Zajac
źródło
Przesyłanie wyjścia lsof przez awk działa świetnie, z jednym niewielkim dodatkiem. Dodałem ; exitpo instrukcji print, aby wydrukować tylko pierwszy txtwpis, nawet jeśli jest ich kilka, jak w przykładzie bash.
qqx
2

Przykład: szukasz nazwy polecenia procesu skojarzenia dla PID 45109...

>    % ps awx | awk '$1 == 45109 { print $5 }'
>    /Applications/Safari.app/Contents/MacOS/Safari
Kserkses
źródło
2
Nie pokaże pełnej ścieżki binarnej, jeśli binarny został uruchomiony po prostu bez nazwy ścieżki.
grigoryvp
nie działa poprawnie, jeśli ścieżka zawiera spacje
Peter Lapisu
1

ps -ef with grep działa dla mnie. Aby uzyskać konkretną nazwę pliku, po prostu przeprowadź grep w ten sposób:

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

(Ten końcowy 'grep -v grep' po prostu zatrzymuje otrzymywanie własnego polecenia grep w danych wyjściowych)

HappySpaceInvader
źródło
1

ps -p <pid> -Opolecenie

L1A1:~ a1155344$ ps -p1 -Ocommand
  PID   TT  STAT      TIME COMMAND
    1   ??  Ss     0:02.26 /sbin/launchd
Jason Tan
źródło