実行中のプロセスのファイル名を使用するスクリプトを書いています。ただし、一部のプロセスの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
の形式であることがわかった場合、これはさらに複雑になります。私がそのフィールド(上記のようなジャムなし)を持ち、手動でチェックして分割する限り、処理がはるかに簡単になります。
完全なプログラム名/ファイル名を取得する方法はありますか?名前にフルパスが含まれているかどうかは問題ではありません。これは簡単に処理できるためです(今のところ)。
_/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
_