2009年1月6日火曜日

procファイルシステムの下のfdディレクトリ

Linuxのprocファイルシステム、まあ大概 "/proc" にあるやつ。以前に「プロセス毎の環境変数を参照する」という記事を作ったが、またproc関連の話。
 

"/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 ---

 

大元の1848を調査しよう、"/proc/{プロセスID}/fd"を見てみよう。
# ls /proc/1848/fd
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


apache が現在開いているファイルへのリンクだとわかる、ソケットやパイプもあるな。
 
 


これを応用すると結構アクロバティックな真似ができる。
削除したファイルをlsofで復元する - ITmedia (linux.com原文の日本語訳)
 

この辺の話は面白いな。確かにapache 動作中にログファイル消しても平気だし、同名のファイルを作ってもそこにログが書き込まれない、あれはそういうわけかと。