MacOSでPIDからプロセスファイル名を取得する方法は?


13

PIDを使用してプロセスのファイル名を取得することは可能ですか?psはプロセスに関する多くの有用な情報を表示しますが、プロセスの実行可能ファイルの場所に関するヒントは表示しません。

回答:


13

プロセスのバイナリの場所を得るための一つの方法は、使用することですlsofし、grep最初のためtxtのセグメント。たとえば、シェルで、シェルがどのバイナリであるかを確認するには、の代わりにシェルのPIDを使用します$$

$ 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

シェルが使用していることがわかり/bin/bashます。

この手法は、プロセスが絶対パスまたは相対パスを使用して起動された場合に機能します。たとえば、1つのシェルに入って実行する

$ sleep 1234567

ps別のシェルで使用すると、起動方法のみが表示されます。

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

を使用するlsofと、実行したバイナリが表示されます。

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

MacPorts coreutils + with_default_namesがインストールされgsleepてい/bin/sleepます。


awkを介したlsof出力のパイピングは、マイナーな追加が1つあるだけで、うまく機能します。; exitprintステートメントの後に追加したのでtxt、bashの例のように複数のエントリがある場合でも、最初のエントリのみが印刷されます。
qqx

2

例:関連付けプロセスのコマンド名の後PID 45109...

>    % ps awx | awk '$1 == 45109 { print $5 }'
>    /Applications/Safari.app/Contents/MacOS/Safari

2
パスを指定せずに名前だけでバイナリを開始した場合、完全なバイナリパスは表示されません。
grigoryvp 2009年

パスに空白が含まれていると正しく動作しない
ピーターラピス


1

ps -efとgrepがうまく機能します。特定のファイル名については、単にgrepを次のようにパイプ処理します。

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

(最後の 'grep -v grep'は、出力で独自のgrepコマンドを取得するのを単に停止します)


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.