"/proc" 以下にはシステムで動作中の各プロセスID名でディレクトリが作られ、それらの情報が保管されているが、その中に"fd" というディレクトリがある。
その中にはプロセスが使用中のファイルへのシンボリックリンクが作らてれる。
実際の例を見るために apache の開いているファイル情報を見てみる。
まず psid をチェックしよか。
# pstree -p
init(1)─┬─agetty(2109)
--- snip ---
├─httpd(1848)─┬─httpd(12453)
│ ├─httpd(12454)
│ ├─httpd(12455)
│ ├─httpd(12456)
│ ├─httpd(12457)
│ ├─httpd(12458)
│ ├─httpd(12459)
│ ├─httpd(12461)
│ └─httpd(13484)
--- snip ---
init(1)─┬─agetty(2109)
--- snip ---
├─httpd(1848)─┬─httpd(12453)
│ ├─httpd(12454)
│ ├─httpd(12455)
│ ├─httpd(12456)
│ ├─httpd(12457)
│ ├─httpd(12458)
│ ├─httpd(12459)
│ ├─httpd(12461)
│ └─httpd(13484)
--- snip ---
大元の1848を調査しよう、"/proc/{プロセスID}/fd"を見てみよう。
# ls /proc/1848/fd
0 1 10 11 12 13 2 3 4 5 6 7 8 9
0 1 10 11 12 13 2 3 4 5 6 7 8 9
数字ばっかり? それはディスクリプタ番号だからだ。
少し細かく言うとプロセスが入出力先として持つディスクリプタの番号を名前にしたリンク 、"File Descriptor" だから "fd" ということらしい。
詳細を表示しよう。
# ls -l
total 0
lr-x------ 1 root root 64 Jan 5 19:31 0 -> /dev/null
l-wx------ 1 root root 64 Jan 5 19:31 1 -> /dev/null
l-wx------ 1 root root 64 Jan 5 19:31 10 -> /var/log/httpd/ssl_error_log
l-wx------ 1 root root 64 Jan 5 19:31 11 -> /var/log/httpd/access_log
l-wx------ 1 root root 64 Jan 5 19:31 12 -> /var/log/httpd/ssl_access_log
l-wx------ 1 root root 64 Jan 5 19:31 13 -> /var/log/httpd/ssl_request_log
l-wx------ 1 root root 64 Jan 5 19:31 2 -> /var/log/httpd/error_log
lrwx------ 1 root root 64 Jan 5 19:31 3 -> socket:[4625]
lrwx------ 1 root root 64 Jan 5 19:31 4 -> socket:[4626]
lrwx------ 1 root root 64 Jan 5 19:31 5 -> socket:[4630]
lrwx------ 1 root root 64 Jan 5 19:31 6 -> socket:[4631]
lr-x------ 1 root root 64 Jan 5 19:31 7 -> pipe:[35186]
l-wx------ 1 root root 64 Jan 5 19:31 8 -> pipe:[35186]
l-wx------ 1 root root 64 Jan 5 19:31 9 -> /var/log/httpd/error_log
total 0
lr-x------ 1 root root 64 Jan 5 19:31 0 -> /dev/null
l-wx------ 1 root root 64 Jan 5 19:31 1 -> /dev/null
l-wx------ 1 root root 64 Jan 5 19:31 10 -> /var/log/httpd/ssl_error_log
l-wx------ 1 root root 64 Jan 5 19:31 11 -> /var/log/httpd/access_log
l-wx------ 1 root root 64 Jan 5 19:31 12 -> /var/log/httpd/ssl_access_log
l-wx------ 1 root root 64 Jan 5 19:31 13 -> /var/log/httpd/ssl_request_log
l-wx------ 1 root root 64 Jan 5 19:31 2 -> /var/log/httpd/error_log
lrwx------ 1 root root 64 Jan 5 19:31 3 -> socket:[4625]
lrwx------ 1 root root 64 Jan 5 19:31 4 -> socket:[4626]
lrwx------ 1 root root 64 Jan 5 19:31 5 -> socket:[4630]
lrwx------ 1 root root 64 Jan 5 19:31 6 -> socket:[4631]
lr-x------ 1 root root 64 Jan 5 19:31 7 -> pipe:[35186]
l-wx------ 1 root root 64 Jan 5 19:31 8 -> pipe:[35186]
l-wx------ 1 root root 64 Jan 5 19:31 9 -> /var/log/httpd/error_log
apache が現在開いているファイルへのリンクだとわかる、ソケットやパイプもあるな。
これを応用すると結構アクロバティックな真似ができる。
削除したファイルをlsofで復元する - ITmedia (linux.com原文の日本語訳)
この辺の話は面白いな。確かにapache 動作中にログファイル消しても平気だし、同名のファイルを作ってもそこにログが書き込まれない、あれはそういうわけかと。