Wie bekomme ich den Prozessdateinamen von der PID in MacOS?

13

Ist es möglich, mithilfe der PID einen Dateinamen eines Prozesses abzurufen? ps zeigt viele nützliche Informationen zu einem Prozess an, jedoch keinen Hinweis auf den Speicherort einer ausführbaren Prozessdatei.

grigoryvp
quelle

Antworten:

13

Eine Möglichkeit, die binäre Position des Prozesses zu ermitteln, besteht darin, lsofund grepfür das erste txtSegment zu verwenden. Verwenden Sie zum Beispiel in der Shell die PID der Shell anstelle von, um zu sehen, um welche Binärdatei es sich handelt $$.

$ 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

Sie können sehen, dass die Shell verwendet wird /bin/bash.

Diese Technik funktioniert, wenn der Prozess mit einem absoluten oder relativen Pfad gestartet wurde. Zum Beispiel in eine Shell gehen und laufen

$ sleep 1234567

und die Verwendung psin einer anderen Shell zeigt nur, wie es gestartet wurde:

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

using lsofzeigt, welche Binärdatei ausgeführt wurde:

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

Ich habe MacPorts coreutils + with_default_names installiert, was erklärt, dass ich aufgegriffen habe gsleepund nicht /bin/sleep.

Blair Zajac
quelle
Das Leiten der Ausgangsleistung durch awk funktioniert hervorragend, mit einem kleinen Zusatz. Ich habe ; exitnach der print-Anweisung hinzugefügt, damit nur der erste txtEintrag gedruckt wird, auch wenn es mehrere wie im bash-Beispiel gibt.
qqx
2

Beispiel: Sie suchen nach dem Namen des zugeordneten Prozessbefehls für PID 45109...

>    % ps awx | awk '$1 == 45109 { print $5 }'
>    /Applications/Safari.app/Contents/MacOS/Safari
Xerxes
quelle
2
Zeigt nicht den vollständigen Binärpfad an, wenn die Binärdatei nur mit dem Namen ohne Angabe des Pfads gestartet wurde.
Grigoryvp
funktioniert nicht richtig, wenn der Pfad Leerzeichen enthält
Peter Lapisu
1

versuche es mit ps aux

vu1tur
quelle
1

ps -ef mit grep funktioniert bei mir. Für einen bestimmten Dateinamen durchlaufen Sie einfach grep wie folgt:

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

(Das letzte 'grep -v grep' verhindert einfach, dass Sie Ihren eigenen grep-Befehl in der Ausgabe erhalten.)

HappySpaceInvader
quelle
1

ps -p <pid> -Befehl

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