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.

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.


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

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

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.)


1

ps -p <pid> -Befehl

L1A1:~ a1155344$ ps -p1 -Ocommand
  PID   TT  STAT      TIME COMMAND
    1   ??  Ss     0:02.26 /sbin/launchd
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.