daemontoolsって知ってますか?
簡単に言えば,ソフトウェアをサービスとして動かしたいときに使えるdaemonizeツールキットという感じでしょうか.
daemonと聞くと,「UnixなどのOSにおいて,fork&execしたプロセスから切り離されてinitプロセスの子供となりバックグラウンドで動作するプロセス」という正しそうな定義を述べることができる人も入れば,「/etc/init.d/httpd start ってやったら動くやつでしょ」などという程度の理解の人もいると思います.
一般に,Unixの世界におけるdaemonといえば,(familyやディストリビューション等によって場所は異なることもありますが)/etc/init.d/以下に起動スクリプトがあって,起動するとバックグラウンドで動作して,なんらかのサービスを内外に向けて提供するソフトウェアないしプロセスを指します.例を挙げるなら,httpd(Apache http server)やmysqld(mysql server),crond(cronを定期実行してくれるサービス),syslogd(システムロギングを提供するサービス)などがありますよね.
さて,我々が普段作成するソフトウェアでも,daemon化したいなーと思うものはたくさんあります.例えば最近私が作った物では,IRCのbotなんかそうですね.
IRCのbotは,起動したらこちらの意思で終了するかシステム自体をshutdownしたりrebootするまでずっと動いていてほしいので,まさにdaemonとして動いてほしいわけです.
しかし,前述したような意味での"daemon"化は,ちょっとめんどくさいのです.Wikipediaに,daemon化するための手順が簡単に書かれていますが,ちょっと面倒ですよね.
また,作成するプログラム自体に,daemonとして動作させるためのコードを記述するよりも,実行者がdaemonとして起動するのか,普通のforeground processとして起動するのかを選択できたほうが,開発するとき便利です.
daemonとして記述されてない普通の実行可能ファイルを,手軽にdaemonライクに動かすことができる便利なコマンドとして,nohupがあります.
$ nohup <command> > /dev/null 2>&1 &
nohupコマンドは,引数として与えたコマンドを実行してくれます.なぜそれがdaemonのように振る舞うのでしょうか.それには,Unixにおけるプロセスについて少しお勉強が必要です.
Terminalからコマンドとして実行されたプロセスは,親プロセスの終了と同時に死んでしまいます.つまり,みなさんよくご存知の,バックグラウンドプロセスを生成する魔法"&"を用いた以下のようなコマンド実行では,プロセスをバックグラウンドで動かすことは可能ですが,実行したシェルが終了したと同時にバックグラウンドプロセスも終了してしますのです.
$ <command> &
これは,親プロセスが終了すると,子プロセスにはSIGHUPというシグナルが送られるためです.これを受け取ると特別シグナルハンドリングをしていないプロセスは終了するようになっています.nohupコマンドは,引数として受け取ったコマンドを,このSIGHUPを無視するようにして実行してくれるのです.
nohupで起動されたプロセスの挙動を,プロセスヒエラルキーをわかりやすく表示してくれる,ps axjfで確認してみましょう.無限ループを実行するperlワンライナーを実行してみます.
$ nohup perl -e ' 1 while 1 ' > /dev/null 2>&1 &
nohupを用いて起動したプロセスは,親であるzshプロセスが生きている間は,以下のようにzshの子プロセスとして動作しています.
$ ps axjf
...
20872 20873 20873 20873 pts/8 21019 Ss 1000 0:00 \_ zsh
20873 21012 21012 20873 pts/8 21019 RN 1000 0:23 \_ perl -e 1 while 1
...
しかし,ひとたびzshプロセスを終了させると,以下のようにどのttyにも所属せず,プロセスヒエラルキーにおいてもトップレベル,つまり,initプロセス子プロセスとして動作していることが分かります.
$ ps axjf
...
1 21012 21012 20873 ? -1 RN 1000 0:45 perl -e 1 while 1
...
nohupを用いることで,とりあえずdaemonなプロセスは作れますが,実際は,daemonをまとめて管理する機構がないと不便です.例えば,システムのboot後にdaemonを起動してくれたり,daemonの出力するログを取ってくれたり,起動,停止,再起動を制御したりといったことです.
これらを,面倒なdaemon化コードを記述したり,複雑な起動スクリプト(/etc/init.d/ にあるような)をいちいち記述しなくても可能にしてくれるのが,daemontoolsなのです.
前編ではUnixにおけるdaemonについてのお話になってしまいましたが,後編ではdaemontoolsのインストールから使用法,たごけんで動いているいくつかのサービスの例を紹介したいと思います.
This article is a great 2048 cupcakes resource for anyone interested in learning more about this subject.
返信削除