プログラムのPIDがわかっている場合は、実行中のプログラムの実行可能ファイルを一覧表示したいと思います。
私が読むことができるバイナリプログラムの場合は、/proc/$pid/exe
実行可能ファイルへのシンボリックリンクです。
ただし、スクリプトプログラム(Pythonプログラムなど)の場合、プログラム自体は/proc/$pid/exe
重要ではありません。これは、私がランチャーを/usr/bin/python
使用しているかどうかを問わず発生します。./program.py
python program.py
私はそれを解決するためにいくつかの方法を試しました。
/proc/$pid/cmdline
スクリプトのファイル名が含まれているが相対パスにあるため、作業ディレクトリが変更された可能性があります。
私も試してみましたが、/proc/$pid/comm
プログラムを通じて簡単に変更できます。
それでは、実行中のプログラムの元のスクリプトファイルをどのように知ることができますか?
答え1
ディスク上のファイルが変更されていない(少なくとも同じ名前のファイルが追加または削除されていない)、/proc/[pid]/cmdline
信頼できると仮定できますか(下記の注意事項を参照)。
~によると工程(5):と/proc/[pid]/environ
を含む初期環境変数を含みます(プログラム自体が内部環境変数を変更しても変更されません)。PWD
PATH
したがって
、inのパスが相対ディレクトリcmdline
名で始まる場合PWD
(in /proc/[pid]/environ
)をデフォルトパスとして使用し、相対パスを解決できます。 inのパス
がプログラム自体の名前である場合(の各ディレクトリをcmdline
繰り返すことができます)PATH
、/proc/[pid]/environ
最初同じ名前のファイル。
注:
/proc/[pid]/exe
逆参照されたように見えるファイル(シンボリックリンクの代わりに、/usr/bin/python3.6
または/usr/bin/python3
シンボリック/usr/bin/python
リンクの場合)
/proc/[pid]/cmdline
また、一部のプログラムに関する奇妙な情報が含まれているため、信頼できない可能性があります。これはプログラムに関連しているようですが、カーネルには関係していないようです。そして私はこのように実行されているPythonスクリプトを観察しませんでした(そしてsys.argv
Pythonで編集しても影響を与えないようです/proc/[pid]/cmdline
)。私の質問これについても少し話しました。
答え2
実験的にbashの場合は、/proc/{pid}/fd/255
実行されたスクリプトのフルパスへのリンクです。
#! /bin/bash
ls -l /proc/$$/fd/255