myfinderの技術や周辺的活動のblog

2009年4月20日月曜日

procディレクトリの中身をちらっと見てみる

カーネルとプロセスの関係を知りたい。
ということで、procディレクトリについてまとめて書いて、後で見られるようにしておく。

今日書いた内容についてはこのページに詳しい。

プロセスごとの環境

プロセスごとの環境とはそもそも何か。
それは、例えばカレントディレクトリやメモリ、環境変数を指す。
この辺の値はプロセス毎に別々のものを持っている。

この辺の情報が集まっているのが/procディレクトリで、特殊なディレクトリだが通常のディレクトリと同じようにアクセス可能になっている。

例えとして、Apacheのプロセス情報を覗いてみる。

# ps auxw | grep httpd
apache 21871 0.0 0.3 235300 12328 ? S Apr19 0:00 /usr/sbin/httpd


この場合、/proc/21872にApacheプロセスの情報が入っていることになる。
例えば当該プロセスのカレントワーキングディレクトリは

# ll /proc/21872/cwd
lrwxrwxrwx 1 root root 0 4月 20 00:18 /proc/21872/cwd -> /

という風にシンボリックリンクなっている。
この場合、Apacheのカレントワーキングディレクトリは/ということになる。

さらに、環境変数が知りたい場合は

# cat /proc/21872/environ | tr "\0" "\n"
HOSTNAME=ayumi
SHELL=/bin/bash
TERM=xterm-color
HISTSIZE=1000
USER=root
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:
MAIL=/var/spool/mail/root
PATH=/sbin:/usr/sbin:/bin:/usr/bin
INPUTRC=/etc/inputrc
PWD=/root
LANG=C
SHLVL=3
HOME=/root
LOGNAME=root
CVS_RSH=ssh
LESSOPEN=|/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
_=/usr/sbin/httpd

という風にすることで、当該プロセスの環境変数を知る事ができる。

他のプロセスにアクセスする

各プロセスには、「標準入力」「標準出力」「標準エラー出力」などがあり、「/proc/[pid]/fd」以下のものがそれにあたる。
例えば、特定プロセスの標準出力にメッセージを飛ばしたい場合、下記のようにコマンドを実行すると、指定したプロセスの標準出力に出力される。

# echo hello > /proc/{pid}/fd/1

ちなみに先ほどのプロセスを指定して、下記のような出力を送ると、Apacheのエラーログにメッセージが出力される。

# echo hello > /proc/21872/fd/2

※上書きされるのが嫌な場合は>>にすればOK

これを応用すると、ローカルのシェル同士でチャットごっこのような事ができる。
もちろん実際はチャットソフトを使うべきだけれども。

というわけで、プロセス毎の動作などを確認したいときなどはprocディレクトリ以下を見るとよいです。

0 件のコメント: