プロセスを開始してからそのバイナリを削除しても、以下から復元できます/proc/<pid>/exe
。
$ cp `which sleep` .
$ ./sleep 10m &
[1] 13728
$ rm sleep
$ readlink /proc/13728/exe
/tmp/sleep (deleted)
$ cp /proc/13728/exe ./sleep-copy
$ diff sleep-copy `which sleep` && echo not different
not different
$ stat /proc/13728/exe
File: ‘/proc/13728/exe’ -> ‘/tmp/sleep (deleted)’
Size: 0 Blocks: 0 IO Block: 1024 symbolic link
一方、私が直接シンボリックリンクを作成している場合は、ターゲットを削除してコピーしてみてください。
cp: cannot stat ‘sleep’: No such file or directory
/proc
カーネルのインタフェースです。それでは、このシンボリックリンクは実際にメモリにロードされたコピーを指していますが、より有用な名前を持っていますか?このリンクは正確にどのようにexe
機能しますか?
答え1
/proc/<pid>/exe
シンボリックリンクの一般的な意味に従わない。技術的にはこれはPOSIX違反と見なすことができますが、/proc
最終的には特別なファイルシステムです。
/proc/<pid>/exe
使用するとシンボリックリンクのように見えますstat
。これは、カーネルが知っているプロセス実行可能ファイルのパス名をエクスポートする便利な方法です。しかし、実際にその「ファイル」を開くと、シンボリックリンクの下の内容を読む一般的なプロセスはありません。代わりに、カーネルは開いているファイルエントリへの直接アクセスのみを提供します。
ls -l
実行可能ファイルが削除されたプロセスのダミーファイルを生成すると、/proc/<pid>/exe
シンボリックリンクターゲットの末尾に「(削除済み)」という文字列があります。これは通常、シンボリックリンクでは意味がありません。名前が「(削除済み)」で終わるファイルは、確実に宛先パスには存在しません。
長すぎます。ファイルシステムのproc
実装は、パス名解決を通じて独自の魔法を実行します。
答え2
/ procのマニュアルページによると、Linux 2.2以降では、このファイルは実行されたコマンドの実際のパス名を含むシンボリックリンクです。明らかに、バイナリはメモリにロードされ、/proc/[pid]/exe
バイナリの内容を指します。記憶の中。
一方、Linux 2.0 以前では/proc/[pid]/exe
明らかに次の点があります。文書(ファイルシステム上)が実行されます。
したがって、Linux 2.0 以前のバージョンで同じコマンドのリストを実行すると、「該当するファイルやディレクトリがありません」というエラーが表示されることがあります。
答え3
すべてのファイルは/proc
要求時に生成されます。したがって、時には通常のファイルとは少し異なる動作をします。
たとえば、多くのファイルが/proc
ディレクトリリストにサイズ 0 の汎用ファイルとして表示されます。しかし、読んでみると空ではありません。その理由は、ファイルの内容が要求時に生成されるためです。内容は、時間の経過とともに変更されるか、ファイルを開いたプロセスによって異なります。したがって、ファイルを開いて読み取らずに内容のサイズを知る方法はありません。
/proc/<pid>/exe
カーネル内で開かれたファイル記述への参照です。開いたファイルの説明を正確に渡す方法はありません。これはカーネル内のデータ構造です。したがって、カーネルはこれをおおよその方法、つまりファイルへのシンボリックリンクとして表現します。抽象ファイルシステム階層で維持する情報のおかげで、カーネルはファイル名を記憶し、ファイル名が変更されてもファイルを追跡します。ファイルが削除されると、カーネルは知っている姓を覚えて(deleted)
名前に追加します。シンボリックリンクターゲットに返された文字列は、readlink
プロセスが呼び出されるたびに動的に生成されます。後で開いた/proc/<pid>/exe
ショートカットは、一般的なシンボリックリンクの確認を実行し、ファイルの説明を直接開きます。/proc/<pid>/fd/<number>
、/proc/<pid>/cwd
および/proc/<pid>/root
他の同様のリンクにも同様に適用されます。
「魔法の」シンボリックリンクの別の例はです/proc/self
。これは動的に作成され、/proc/<pid>
それにアクセスするプロセスのディレクトリを指します。