任意のプロセス名からそのプログラムの絶対パスを得る

実行中のプロセスから絶対パスほしくて調べたけど、誰得なんだろう。


プロセスID 1234 で使っているプログラムの絶対パスを得る

ls -l /proc/1234/exe | awk {'print $11'}

もはや常識


プログラムが生成したプロセスIDを記したファイルから読み取る方法もあります。

ls -l /proc/`cat PID_FILE`/exe | awk {'print $11'}

常套手段


でもプロセスIDは変動するからいちいち調べるのめんどい。
プログラム名は固定なんだからそこから得られてもいいじゃん。


ぱっと思いついたのがワイルドカードで全部拾ってgrep

ls -l /proc/*/exe 2>&1 | awk {'print $11'} | grep プロセス名

ただし、これはバイナリファイルのみであって、
スクリプトファイルでは/bin/bashとかに置き換わってしまうので、とれません。
ps -xをやってみるとわかると思います。


では無理なのか、というとそうでもなく、
/proc/*/fd の下にそのスクリプトファイルのパスがあるはずなので、そこから得ることができます。

ls -l /proc/*/fd 2>&1 | awk {'print $11'} | grep プロセス名

ちなみに、これらはプロセスIDを得ることができません。
(得られるのはあくまで絶対パスのみ。上二つは元々プロセスIDを知っている前提。)


プロセスID取得はこんなかんじで出来ます。

ps -A | grep プロセス名 | awk {'print $1'}

もはや書くことでもなかった・・・