web-dev-qa-db-ja.com

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

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

13
grigoryvp

プロセスのバイナリの場所を取得する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を取得したことを示しています。

13
Blair Zajac

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

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

ps -p <pid> -Oコマンド

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

ps auxを試す

1
vu1tur

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コマンドが表示されないようにするだけです)

1