daemontoolsをSRPMから入れてみたメモ

使ったこと無かったし練習目的でインストールして、的当なプログラムをデーモン化してみました。後で忘れて調べ直すのもやなので、メモって置きます。

インストール

SRPMの入手

daemontoolsは、CentOSFedorayumリポジトリ*1に無いので、ソースからビルドするか、どこからかRPMを探してくる事になります。http://www.qmailtoaster.org/で、daemontoolsを含めていくつかのSRPMを配布しているようです。公式というわけじゃないと思いますが、daemontoolsの作者が作っている他のソフトウェア*2のパッケージも配布しているようです。公式はソースしか配布してないので、これを使います。

rpmbuild --rebuild
$ curl -LO http://mirrors.qmailtoaster.net/daemontools-toaster-0.76-1.3.6.src.rpm
rpmbuild --rebuild daemontools-toaster-0.76-1.3.6.src.rpm
rpm -ivh /usr/src/redhat/RPMS/x86_64/daemontools-toaster-0.76-1.3.6.x86_64.rpm

SRPMからrpmbuild --rebuildRPMが作れます。生成先は、.rpmmacrosとかで設定してなければ、上記の通り。なお、環境はServersman@VPSだったので、rpmbuildがなく、sudo yum rpm-buildでいれました。

/etc/inittabの編集
$ sudo vi /etc/inittab
#daemontools
SV:123456:respawn:/command/svscanboot

インストール工程かちょっと微妙だけど、/etc/inittabの最後あたりに追記します。

編集したinittabの読み込み
$ sudo kill -HUP 1

これでsvscanbootが動いてsvscanを起動させます。

補足

 inittabの変更を有効にするには「kill -HUP 1」を実行する必要がありますが、installスクリプトですでに実行されています。

daemontoolsによるロギングとプロセス監視 (1/3):実用qmailサーバ運用・管理術(9) - @IT

実はソースから入れる方が簡単で、用意されたinstallスクリプトが、ここまでやってくれます。よくある./configuremakeではなく、insutallスクリプトを動かせばいいらしいです。そのうち、そっちの方法も1回やってみようかな。

補足2

ちょっと所用でシリアルコンソールアクセスしたくなったのだが、init処理がFedora 9でSysVinitからUpstartに変更されたことによって、設定方法が色々変わってしまった。

中略

/etc/inittab
これまでのinitの挙動を書いていた/etc/inittabはrunlevelの設定のみを残し、他の設定(システム初期化、Ctrl+Alt+Delete押下時の挙動、そして今回のターミナル関連の設定)が個々の設定ファイルに分散された。
よって、このファイルは編集する必要なし。

Fedora 9以降でシリアルコンソールを使用可能にする方法 - Kerosoft : Modus Operandi

今回はCentOSでやったけど、Fedora/etc/inittabを使わなくなっているらしい。installスクリプトはこの辺考慮してくれるんだろうか?

設定

runスクリプト
$ sudo mkdir -p /service/example
$ vi /service/example/run
#!/bin/sh
exec 2>&1
exec \
  setuidgid myuser \
  /usr/local/bin/foo \
  --no-daemon \
  --stdout \
  --stderr

/serviceディレクトリはもしかしたらインストール時に作成されたかも?よく覚えてない。/service/ソフトウェア名/runという形式で、runスクリプトを用意します。スクリプトの内容は、ほぼ書き写しなので説明が書けるほどには理解出来てません。

setuidgid myuserで実行ユーザーを変更してます。変更しないと多分rootが実行する事になると思う。

パーミッション
$ ls -l /service/example
drwxr-xr-x 4 root root 4096  916 14:54 log
-rwxr--r-- 1 root root  112  916 14:28 run
drwx------ 2 root root 4096  929 14:45 supervise
$ sudo chmod u+x /service/example/run

runスクリプトはshebangの通りシェルスクリプトなので実行権限を与えます。これ与え忘れても、daemontoolsはあんまり言ってくれないので割と気がつきにくい。

ログ
$ sudo mkdir -p /service/example/log/main
$ sudo vi /service/example/log/run
#!/bin/sh
exec setuidgid myuser multilog t ./main
$ sudo chmod u+x /service/example/log/run
$ sudo chown myuser:myuser /service/example/log/main

こんな感じにしておくと、デーモン化したプログラムの標準出力と標準エラーをログに出してくれます。

補足
$ ps aux | grep -v grep | grep supervise
root     11691  0.0  0.0   3660   364 ?        S    Sep16   0:00 supervise example
root     17811  0.0  0.0   3660   364 ?        S    Sep16   0:00 supervise log
root     65102  0.0  0.0   3648   324 ?        S    Sep16   0:00 readproctitle service errors: ...us.new: file does not exist?supervise: fatal: unable to start log/run: file does not exist?supervise: warning: unable to open log/supervise/status.new: file does not exist?supervise: warning: unable to open log/supervise/status.new: file does not exist?supervise: fatal: unable to start log/run: file does not exist?supervise: warning: unable to open log/supervise/status.new: file does not exist?

上記の最後に変な出力が出てますが、daemontoolsの設定がダメな時は、ここを見るようです。非常に分かりにくい。
今も思いっきりエラーって出てますが、これは過去の情報が残っているだけ。psコマンドを1秒置きくらいに何度も実行して、「readproctitle service errors:」の右側が書き換わってるなら、何かエラーがあると考えられるっぽい。

setlockで排他制御をする。主にcronでの重複起動の防止

[ ~]# crontab -e
01 * * * * /usr/bin/setlock -nx /tmp/script.lock /foo/cron/script.sh

これで /tmp/script.lock がロックできるか、なければ新しく作成して script.sh を実行するし、ロックできなければあきらめるようになるよ。

右往左往: daemontoolsをインストールしたよ

daemontoolsにはsetlockコマンドも入っていて、上記のようにロックファイルを使った排他制御が簡単に出来るっぽい。なんでdaemontoolsに含まれてるのかよく分からないけど、daemontoolsのコマンドが使う内部コマンド的なものとかかな?setlockコマンドは、まだ使ったこと無いけど、覚えておいたら役に立つ場面もあるかも。

http://www.sssg.org/blogs/naoya/archives/1491

もうちょい詳しい仕組みは、ここが詳しいかも。

環境

サーバー Serversman@VPS Entry
Linux CentOS 5.7
daemontools daemontools-toaster-0.76-1.3.6

*1:野良リポジトリにはあるかも知れないけど

*2:qmaildjbdnsなど