実行中のプロセスのファイル名を使用するスクリプトを作成しています。しかし、確信できない。いっぱい一部のプロセスの実行可能ファイル名。
Name
最初は、項目/proc/PID/status
(または2番目のフィールド)を照会することにしました/proc/PID/stat
。しかし、それによるとマンページ、フィールドは常に15文字に切り捨てられますが、競合/混乱を避けるためにフルネームが必要です。
への答えこの問題お勧めですが/proc/PID/cmdline
問題があります。一部のプログラム(クロム、電子など)は、その中の値を使用して愚かで巧妙な操作を実行するため、そこからデータを分割し、マンページに提案されたプログラム名を直接取得することは/proc/PID/cmdline
できません。NULL
もともとargv [0]フィールドをスペースで区切ることはパス/ファイル名にスペースを含めることができるので、スペースで区切るのは良いオプションではないと思います。
一部のスクリプト(Pythonスクリプトなど)がフォーマットであり、一部のスクリプトがフォーマットであることがわかった場合、/usr/bin/python /path/to/script
これはより複雑になります/path/to/script
。それでもフィールドがあり(上記のようにブロックされていない)、手動でスキャンして分割する限り、処理がはるかに簡単です。
完全なプログラム名/ファイル名を取得する方法についてのアイデアはありますか?名前にフルパスが含まれているかどうかは重要ではありません。これは処理が容易であるためです(これまで見たものから見ることができます)。
答え1
/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
答え2
procfs-2サポート標準を使用するプラットフォームでは、次のようにprocfs
結果を得ることができます。
ls -l /proc/<pid>/path/a.out
a.out ファイルは、バイナリファイルの絶対パスへのシンボリックリンクです。
質問にはLinuxが記載されていないので、procfs
procfsの発明者であるRoger Faulknerの元の実装でこの機能がどのように機能するかについての情報を提供することは合理的です。