PIDを使用してプロセスのファイル名を取得することは可能ですか? psは、プロセスに関する多くの有用な情報を表示しますが、プロセスの実行可能ファイルの場所に関するヒントは表示しません。
プロセスのバイナリの場所を取得する1つの方法は、最初の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がインストールされています。これは、/bin/sleep
ではなくgsleep
を取得したことを示しています。
例:PID 45109
の関連付けプロセスコマンド名の後です...
> % ps awx | awk '$1 == 45109 { print $5 }'
> /Applications/Safari.app/Contents/MacOS/Safari
ps -p <pid> -Oコマンド
L1A1:~ a1155344$ ps -p1 -Ocommand
PID TT STAT TIME COMMAND
1 ?? Ss 0:02.26 /sbin/launchd
ps auxを試す
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コマンドが表示されないようにするだけです)