daemontoolsをSRPMから入れてみたメモ
使ったこと無かったし練習目的でインストールして、的当なプログラムをデーモン化してみました。後で忘れて調べ直すのもやなので、メモって置きます。
インストール
SRPMの入手
daemontoolsは、CentOSやFedoraのyumリポジトリ*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 --rebuild
でRPMが作れます。生成先は、.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スクリプトが、ここまでやってくれます。よくある./configure
やmake
ではなく、insutallスクリプトを動かせばいいらしいです。そのうち、そっちの方法も1回やってみようかな。
補足2
ちょっと所用でシリアルコンソールアクセスしたくなったのだが、init処理がFedora 9でSysVinitからUpstartに変更されたことによって、設定方法が色々変わってしまった。
中略
/etc/inittab
Fedora 9以降でシリアルコンソールを使用可能にする方法 - Kerosoft : Modus Operandi
これまでのinitの挙動を書いていた/etc/inittabはrunlevelの設定のみを残し、他の設定(システム初期化、Ctrl+Alt+Delete押下時の挙動、そして今回のターミナル関連の設定)が個々の設定ファイルに分散された。
よって、このファイルは編集する必要なし。
今回は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 9月 16 14:54 log -rwxr--r-- 1 root root 112 9月 16 14:28 run drwx------ 2 root root 4096 9月 29 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 |