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

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

実行中のプロセスのファイル名を使用するスクリプトを作成しています。しかし、確信できない。いっぱい一部のプロセスの実行可能ファイル名。

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が記載されていないので、procfsprocfsの発明者であるRoger Faulknerの元の実装でこの機能がどのように機能するかについての情報を提供することは合理的です。

関連情報