web-dev-qa-db-ja.com

Linuxで実行中のプロセスの完全な実行可能ファイル名を取得する方法

実行中のプロセスのファイル名を使用するスクリプトを書いています。ただし、一部のプロセスのfull実行可能ファイル名を特定できません。

最初に、/proc/PID/status(または/proc/PID/statの2番目のフィールド)のNameエントリをクエリすることにしました。ただし、 manpage によると、そのフィールドは常に15文字に切り捨てられますが、競合/混乱を避けるために完全な名前が必要です。

この質問 の回答は/proc/PID/cmdlineの使用を提案していますが、問題もあります。一部のプログラム(例:クロム、電子)は/proc/PID/cmdlineの値に対して愚か/賢いことをしているので、NULLでデータをそこに分割するだけではなく、マンページで提案されているようにプログラム名を直接取得できません。 -彼らは多くのことを元のargv [0]フィールドに入力し、それらをスペースで区切ります。パス/ファイル名にスペースが含まれている可能性があるため、スペースで分割するだけでは良い選択ではないと思います。

いくつかのスクリプト(例pythonスクリプト)が/usr/bin/python /path/to/scriptの形式であるのに/path/to/scriptの形式であることがわかった場合、これはさらに複雑になります。私がそのフィールド(上記のようなジャムなし)を持ち、手動でチェックして分割する限り、処理がはるかに簡単になります。

完全なプログラム名/ファイル名を取得する方法はありますか?名前にフルパスが含まれているかどうかは問題ではありません。これは簡単に処理できるためです(今のところ)。

5
renyuneyun

_/proc/$PID/exe_はあなたが探しているもののようです:( proc(5)

/ proc/[pid]/exe
Linux 2.2以降では、このファイルは実行されたコマンドの実際のパス名を含むシンボリックリンクです。このシンボリックリンクは通常どおり逆参照できます。それを開こうとすると、実行可能ファイルが開きます。

したがって、単に:

_$ /bin/cat & readlink /proc/$!/exe
/bin/cat
_

実際には、実行可能ファイルの名前変更に従います。

_/tmp$ cp /bin/cat . ; ./cat & mv cat dog ; readlink /proc/$!/exe
/tmp/dog
_
4
ilkkachu