現在実行中のスクリプトファイルへのパスを取得するには?

現在実行中のスクリプトファイルへのパスを取得するには?

プログラムのPIDがわかっている場合は、実行中のプログラムの実行可能ファイルを一覧表示したいと思います。

私が読むことができるバイナリプログラムの場合は、/proc/$pid/exe実行可能ファイルへのシンボリックリンクです。

ただし、スクリプトプログラム(Pythonプログラムなど)の場合、プログラム自体は/proc/$pid/exe重要ではありません。これは、私がランチャーを/usr/bin/python使用しているかどうかを問わず発生します。./program.pypython program.py

私はそれを解決するためにいくつかの方法を試しました。

/proc/$pid/cmdlineスクリプトのファイル名が含まれているが相対パスにあるため、作業ディレクトリが変更された可能性があります。

私も試してみましたが、/proc/$pid/commプログラムを通じて簡単に変更できます。

それでは、実行中のプログラムの元のスクリプトファイルをどのように知ることができますか?

答え1

ディスク上のファイルが変更されていない(少なくとも同じ名前のファイルが追加または削除されていない)、/proc/[pid]/cmdline信頼できると仮定できますか(下記の注意事項を参照)。

~によると工程(5):と/proc/[pid]/environを含む初期環境変数を含みます(プログラム自体が内部環境変数を変更しても変更されません)。PWDPATH

したがって
、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.argvPythonで編集しても影響を与えないようです/proc/[pid]/cmdline)。私の質問これについても少し話しました。

答え2

実験的にbashの場合は、/proc/{pid}/fd/255実行されたスクリプトのフルパスへのリンクです。

#! /bin/bash

ls -l /proc/$$/fd/255

関連情報