実行中プログラムのイメージを得る

Twitter見てたらこんなこと言ってる人がいました。

昔自分もそんなこと考えたなーと思いつつ、Linuxなら /proc/<pid>/exe が実行ファイルへのリンクになってるんで、

と言ってみたら、

まあ、たしかにシンボリックリンクだし、実行ファイルが消されちゃったらしょうがないなーと思ったんですよ。

そしたら、こんなリプライがついて、

この緑の怪獣が何者かは知らないんですけど、リンクなんだから実行ファイルが消されちゃったらどうしようもないのに何言ってんの?シロウトなの?

と思ったら実は消されててもアクセスできるんですよ!びっくりさ!

がちゃぴ^H^H^H緑の怪獣さんすごい!

試してみます。プログラム作るの面倒なんで、sleep コマンドで。

~% cp /bin/sleep /tmp
~% /tmp/sleep 99999 &
[1] 18728
~% ls -l /proc/18728/exe
lrwxrwxrwx 1 tommy tommy 0 10月 25 23:38 /proc/18728/exe -> /tmp/sleep
~% rm /tmp/sleep 
~% ls -l /proc/18728/exe
lrwxrwxrwx 1 tommy tommy 0 10月 25 23:38 /proc/18728/exe -> /tmp/sleep (deleted)
~% ls -lL /proc/18728/exe
-rwxr-xr-x 0 tommy tommy 35000 10月 25 23:38 /proc/18728/exe
~% cmp /proc/18728/exe /bin/sleep
~% /proc/18728/exe --version
sleep (GNU coreutils) 8.26
Copyright (C) 2016 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

作者 Jim Meyering および Paul Eggert。

exe はリンクファイルなので、実行ファイルが消されたら (deleted) となって、もう参照できないように思えるんだけど、実体を見ようとしたらちゃんと見えるんですよ。リンクカウント 0 のファイルとして。

それをそのまま読み込むこともできるし、実行だってできる。面白い。

プロセスの実行ファイルだけじゃなくて、プロセスがオープンしているファイルも /proc/<pid>/fd/ 配下で見ることができるんですけど、それも同じように実体が消えたとしてもアクセスできます。

UNIX/Linux ではオープン中のファイルがファイルシステム上から削除されても、ディレクトリツリーからは見えなくなるだけで、ディスク上には残ってて、そのファイルをオープンしているプロセスがすべて死んだら、ディスク上の領域からもなくなります。

/proc はカーネル内の管理領域をファイルシステムとして見せている特殊なファイルシステムだから、こういうこともできるんですかねー。

ところでやっぱりこれは Linux だけでしか通用しないみたいです。

おまけ

言い出しっぺの人が全然反応ないなーと思ってたら…。