はじめに
daemontools自体はけっこー古いものなので情報はいっぱいありますが、
starmanとMojoliciousを立ち上げる際に久しぶりに入れたのでついでにメモ。
今回自分はdaemontools経由でstarmanからmojoliciousアプリを起動し
nginxでプロキシする的なメモを書いた際にdaemontoolsのところが長くなったので、
肉付けして切り出したスニペット記事にするための記事としてみました。
※ 書いてたら思ってた以上に長くなった。。。
アジェンダ
- daemontoolsとは
- daemontoolsダウンロード&インストール
- svscanを起動
- daemon監視するserviceを作ってsvstatで確認してみる
- svcコマンドを使って見る
- serviceの止め方
- multilogを設定する
1. daemontoolsとは
この辺はいつもどおり自分の説明力に自信がないので、安定の引用で。
daemontoolsとは、デーモンを監視するツールのことです。
デーモンが不意にストップしたとき、それは止まったままになります。
しかし daemontools によって監視させておけば、 自動的に再起動してくれます。
メリット
最近はdaemontoolsではなくSupervisorの記事も多いですが、
とはいえぐぐると何かとdaemontoolsで監視
みたいな記事はまだ多く見かけるので
参考にしたまんまの流れで入れてしまいがちですが、
使うにあたってのメリットもそれとなーくレベルでも覚えておきたいので引用メモ
- syslogと異なりソケットの代わりにパイプを使用するため、ログが確実に取れる
- ログの容量を監視してくれる。ログのローテーションは日付ではなく、ある一定容量に達したかどうかによって行われる
- サービスの追加・削除が簡単にできる。システム起動時に自動的に開始するか否かも簡単に指定できる
- サービスを監視するためのロックファイルを作らなくて済む
- デーモンのPIDを直接調べなくてもシグナルが送れる。daemontoolsを使って走らせた各デーモンはPIDではなく名前で指定でき、複数のデーモンにシグナルを送ることも可能
- 起動するデーモンごとにlimitがかけられる。これにより、メモリ使用量やユーザー権限を制限できる
2. daemontoolsダウンロード&インストール
というわけでさっそくいれて使ってみるところから。
ダウンロード&インストール
※ dasemontools用のディレクトリ作成 $ sudo mkdir -p /package $ ls -ld /package/ drwxr-xr-x 2 root root 4096 6月 18 01:06 2015 /package/ ※ sticyな権限を付与 & 確認 $ sudo chmod 1755 /package $ ls -ld /package/ drwxr-xr-t 2 root root 4096 6月 18 01:06 2015 /package/ ※ ダウンロード $ cd /package $ sudo wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz $ sudo tar xvzf daemontools-0.76.tar.gz ※ 確認 $ ls -l drwxr-xr-t 3 root root 4096 7月 13 01:49 2001 admin -rw-r--r-- 1 root root 36975 7月 13 01:58 2001 daemontools-0.76.tar.gz ※ パッチをあてないとコンパイルに失敗するのでパッチをあてる $ cd admin/daemontools-0.76 $ sudo wget http://www.qmail.org/moni.csi.hu/pub/glibc-2.3.1/daemontools-0.76.errno.patch $ sudo patch -p1 < daemontools-0.76.errno.patch $ sudo package/install
補足 (sticy
chmod 1755
でスティッキービットを付与しています。
スティッキービットはこのあたりを参考にするとわかりやすいです。
スティッキービットとは、ディレクトリに対して設定するアクセス権のひとつで、ファイルに関してはほとんど有効性がありません。 ステッキービットが設定されているディレクトリでは、書き込みが許可されたファイルであっても、
他のユーザーが所有しているものは削除できないようになります。
主な構成
daemontoolsは展開するとこんな感じになりますっていうのをかるく触れておきます。
展開したディレクトリ
$ tree -d -L 3 /package `-- admin |-- daemontools -> daemontools-0.76 `-- daemontools-0.76 |-- command |-- compile |-- package `-- src
コマンドを確認
daemontoolsで使うsvstat、svc、svscanなどのコマンドがどこにあるかも知ってみます。
※ svstatからたどる $ which svstat /usr/local/bin/svstat ※ /usr/local/binを見てみる ※ /command以下のコマンドのシンボリックリンクが作成されている $ ls -al /usr/local/bin | grep command lrwxrwxrwx 1 root root 15 Jun 18 01:15 envdir -> /command/envdir lrwxrwxrwx 1 root root 18 Jun 18 01:15 envuidgid -> /command/envuidgid lrwxrwxrwx 1 root root 15 Jun 18 01:15 fghack -> /command/fghack lrwxrwxrwx 1 root root 17 Jun 18 01:15 multilog -> /command/multilog lrwxrwxrwx 1 root root 17 Jun 18 01:15 pgrphack -> /command/pgrphack lrwxrwxrwx 1 root root 22 Jun 18 01:15 readproctitle -> /command/readproctitle lrwxrwxrwx 1 root root 16 Jun 18 01:15 setlock -> /command/setlock lrwxrwxrwx 1 root root 18 Jun 18 01:15 setuidgid -> /command/setuidgid lrwxrwxrwx 1 root root 18 Jun 18 01:15 softlimit -> /command/softlimit lrwxrwxrwx 1 root root 18 Jun 18 01:15 supervise -> /command/supervise lrwxrwxrwx 1 root root 12 Jun 18 01:15 svc -> /command/svc lrwxrwxrwx 1 root root 13 Jun 18 01:15 svok -> /command/svok lrwxrwxrwx 1 root root 15 Jun 18 01:15 svscan -> /command/svscan lrwxrwxrwx 1 root root 19 Jun 18 01:15 svscanboot -> /command/svscanboot lrwxrwxrwx 1 root root 15 Jun 18 01:15 svstat -> /command/svstat lrwxrwxrwx 1 root root 15 Jun 18 01:15 tai64n -> /command/tai64n lrwxrwxrwx 1 root root 20 Jun 18 01:15 tai64nlocal -> /command/tai64nlocal ※ /command配下をみてみる ※ /package/admin/daemontools/commandへのシンボリックリンクでいっぱい $ tree /command/ /command/ |-- envdir -> /package/admin/daemontools/command/envdir |-- envuidgid -> /package/admin/daemontools/command/envuidgid |-- fghack -> /package/admin/daemontools/command/fghack |-- multilog -> /package/admin/daemontools/command/multilog |-- pgrphack -> /package/admin/daemontools/command/pgrphack |-- readproctitle -> /package/admin/daemontools/command/readproctitle |-- setlock -> /package/admin/daemontools/command/setlock |-- setuidgid -> /package/admin/daemontools/command/setuidgid |-- softlimit -> /package/admin/daemontools/command/softlimit |-- supervise -> /package/admin/daemontools/command/supervise |-- svc -> /package/admin/daemontools/command/svc |-- svok -> /package/admin/daemontools/command/svok |-- svscan -> /package/admin/daemontools/command/svscan |-- svscanboot -> /package/admin/daemontools/command/svscanboot |-- svstat -> /package/admin/daemontools/command/svstat |-- tai64n -> /package/admin/daemontools/command/tai64n `-- tai64nlocal -> /package/admin/daemontools/command/tai64nlocal
3. svscanを起動
svscanを起動します。
svscanはdaemontoolsの本体的なヤツですが、説明は安定の引用で。
svscanは現在のディレクトリの各サブディレクトリ(1000個のサブディレクトリの制限まで)に対して、一つのsuperviseのプロセスを開始させます。
svscanはドットで始まるサブディレクトリ名をとばします。
supervise は svscan のパスになければなりません。参考 : svscan プログラム
svscanの起動はsvscanbootが行いますが、
CentOS6あたりからは/etc/inittab
ではなくupstart
による起動が必要とのことなので
その対応をしてから起動します。
やることは下記
- /etc/inittabの編集
- /etc/init/svscan.confの作成
- svscanの起動
/etc/inittabの編集
これは1行コメントアウトするだけです
$ sudo vi /etc/inittab ---- vi編集 ---- SV:123456:respawn:/command/svscanboot ↓ コメントアウト #SV:123456:respawn:/command/svscanboot ----------------
/etc/init/svscan.confの作成
/etc/init/svscan.conf
は無いので作成して下記のようにします。
$ sudo vi /etc/init/svscan.conf ---- vi ---- start on runlevel [12345] respawn exec /command/svscanboot ------------
この辺はこちらが参考になりました。
→CentOS6にdaemontoolsをインストールするとそのままでは自動起動しない。
svscanの起動
これでOSを再起動すればsvscanが立ち上がりますが、
下記コマンドでも立ち上げることができます。
念のためOS再起動しても立ち上がるかは確認したほうが良いですね。
※ svscan立ち上げる $ sudo initctl reload-configuration $ sudo initctl start svscan svscan start/running, process 14500 ※ svscanの起動を確認 $ ps auxf | grep svscan -A 2 root 14500 0.0 0.0 11336 1228 ? Ss 23:12 0:00 /bin/sh /command/svscanboot root 14502 0.0 0.0 4104 408 ? S 23:12 0:00 \_ svscan /service root 14503 0.0 0.0 3920 332 ? S 23:12 0:00 \_ readproctitle service errors: ................................................................................................................................................................................................................................................................................................................................................................................................................
/command/svscanboot
から子プロセス的に
readproctitle service errors
というが出てますが、
これはrunスクリプトの実行エラー(まだ監視するrunファイルを作っていないエラー)です。
あとで消せばいいので自分は気にしませんが、対処方はこの記事が参考になります。
→daemontoolsの利用法をいくつか
4. daemon監視するserviceを作ってsvstatで確認してみる
いよいよdaemontoolsで監視をしてみます。
今回はダミーで適当なserviceを作って確認します。
やることは下記。
runスクリプトは下記参考サイトをまんま使わせていただきました(><)
→daemontools でプロセス監視 (svscan, supervise, multilog)
service用ディレクトリとrunファイルを作成する
※ ホームディレクトリにdaemon監視するservis用ディレクトリとrunスクリプトを作成 $ mkdir ~/sample_daemon_service $ vi ~/sample_daemon_service/run ---- vi作成 ---- #!/bin/sh i=1 while [ 1 ]; do echo $i i=`expr $i + 1` sleep 1 done; --------------- ※ runスクリプトの実行権をあたえておく $ chmod +x ~/sample_daemon_service/run
/service配下にシンボリックリンクを貼る
/service配下にシンボリックリンクを貼ることでdaemon監視が始まります。
また、監視が始まると同時にservice用ディレクトリ内にsuperviseというディレクトリが作成されます。
daemontoolsはこのディレクトリ内のファイルをもとに監視状況を把握します。
$ sudo ln -s /home/hoge/sample_daemon_service/ /service/ $ ls -l /service/ lrwxrwxrwx 1 root root 37 6月 20 23:39 2015 sample_daemon_service -> /home/hoge/sample_daemon_service/ ※ 確認してみる $ ls -l -rw-r--r-- 1 hoge hoge 75 6月 21 04:59 2015 run drwx------ 2 root root 4096 6月 21 05:22 2015 supervise $ sudo tree ~/sample_daemon_service |-- run `-- supervise |-- control |-- lock |-- ok `-- status
権限変えつつsvstatでdaemon監視状況を確認する
早速svstatで監視状況を見たいですが、
上記で確認したsuperviseディレクトリの所有者がrootで作成されているためsvstatがエラーになります。
なので、所有者を変えてから実行します。
※ 試しにsvstatしてみる $ svstat /service/sample_daemon_service /service/sample_daemon_service: unable to open supervise/ok: access denied ※ 所有権を変えておく $ sudo chown -R hoge:hoge ~/sample_daemon_service/supervise $ svstat /service/sample_daemon_service /service/sample_daemon_service: up (pid 7700) 123 seconds
runスクリプトがエラーや権限などでうまく実行できない場合はsvstatを行うたびに
1 seconds
と0 seconds
を繰り返す感じになるので見直してみてください。
5. svcコマンドを使って見る
svcコマンドでサービス監視の起動/停止を行います。
$ svstat /service/sample_daemon_service /service/sample_daemon_service: up (pid 9530) 638 seconds ※ downしてみる $ svc -d /service/sample_daemon_service ※ 確認するとdownしている $ svstat /service/sample_daemon_service /service/sample_daemon_service: down 6 seconds, normally up ※ upしてみる $ svc -u /service ※ 確認するとupしている $ svstat /service/sample_daemon_service /service/sample_daemon_service: up (pid 10869) 2 seconds
svcオプション
svcのオプションはこんな感じです
オプション | 説明 |
---|---|
-u | サービスの起動する |
-d | サービスを停止する |
-x | サービスが停止したらsuperviseも終了する |
-t | TERMシグナルでサービスを再起動する |
他にもオプションがありますが、これくらいで十分でしょう。気になる場合は下記が参考になります。
→daemontools HOW-TO (α版)
/service配下の指定
svc
やsvstat
はワイルドカード指定もできます
$ svstat /service/* /service/sample_daemon_service: up (pid 19771) 7 seconds, normally down
6. serviceの止め方
止め方(起動させないやりかた)はいくつかあります。
svc -d
でダウン- /service配下のサービスディレクトリ名に
.
(ドット)つける- ~/sample_daemon_serviceに
down
ファイルを置く
svc -d
でダウン
これは↑で確認したとおりですね
/service配下のサービスディレクトリ名に.(ドット)
つける
daemontoolsは/service
配下にある.(ドット)
から始まるディレクトリは無視します。
これを利用して起動させなくします。
※ 起動を確認 $ svstat /service/* /service/sample_daemon_service: up (pid 18221) 10 seconds ※ 動いてるサービスをドット付きにリネームする $ sudo mv /service/sample_daemon_service /service/.sample_daemon_service ※ 停止させる $ svc -d /service/.sample_daemon_service/ ※ 起動させてみるがドットつきのものは無視される $ svc -u /service/* zsh: no matches found: /service/*
~/sample_daemon_serviceにdown
ファイルを置く
中身がカラのdown
ファイルを置いておくことでも起動させなくできます。
しかし、このやり方はサーバが再起動したときや、
svscanが再起動したときに有効な方法で、svc
での再起動のときなどには有効ではありません。
$ svstat /service/* /service/sample_daemon_service: up (pid 19421) 22 seconds ※ downファイルを作ってみる $ touch ~/sample_daemon_service/down ※ svcで再起動してみる $ svc -t /service/* ※ normally downとつくようになったものの起動(up)している $ svstat /service/* /service/sample_daemon_service: up (pid 19592) 14 seconds, normally down ※ svscanを再起動してみる $ sudo initctl restart svscan svscan start/running, process 19757 ※ 起動しなくなる $ /service/sample_daemon_service: down 10 seconds ※ しかしsvc -uは有効。確認すると立ち上がってる $ svc -u /service/* $ svstat /service/* /service/sample_daemon_service: up (pid 19771) 7 seconds, normally down
5. multilogを設定する
multilogはdaemontoolsが監視しているプロセスの標準/エラー出力等のロギングを行うものです。使う手順としてはこんな感じです
- multilog用のrunスクリプト作成
- multilogを反映する
- ログを確認してみる
multilog用のrunスクリプト作成
multilog用のrunスクリプトを作成します。
runスクリプト内でsetuidgid hoge
をかますことで
ログファイル類がrootではなくhoge
で作成されます。
$ mkdir ~/sample_daemon_service/log $ vi ~/sample_daemon_service/log/run ---- vi作成 ---- #!/bin/sh exec setuidgid hoge multilog t ./main ---------------- ※ log/runスクリプトに実行権を与えます $ chmod +x ~/sample_daemon_service/log/run
multilogを反映する
multilogを反映するには自分が確認した感じだと下記2つのどちらかの方法でできます。
- serviceの監視を再設定する
- svscanを起動しなおす
serviceの監視を再設定する
serviceの監視を設定しなおすといっても普通にsvc -d
からsvc -u
やるだけだとダメでした。
下記のような手順で起動しなおすことでmultilogが反映されます。
$ sudo mv /service/sample_daemon_service /service/.sample_daemon_service $ svc -dx /service/.sample_daemon_service $ sudo mv /service/.sample_daemon_service /service/sample_daemon_service $ svc -u /service/sample_daemon_service
今回は/service/
配下が1つだから良いもののいっぱい増えてからやると大変そうです
svscanを起動しなおす
これは簡単で純粋に再起動します。
$ sudo initctl restart svscan
service監視の再設定と違っていっきにできるので簡単ですが、
svscanごと落として再起動するとdaemontoolsからのrunスクリプトからフォークしたプロセスなんかは心配ですね。
ログを確認してみる
ログファイルは~/sample_daemon_service/log/main/current
というファイルに吐かれます。
※ multilogの一式を確認 $ cd ~/sample_daemon_service/log $ ls -l drwx------ 2 hoge hoge 4096 6月 21 06:38 2015 main -rwxr-xr-x 1 hoge hoge 52 6月 21 06:34 2015 run drwx------ 2 root root 4096 6月 21 06:38 2015 supervise ※ ログを確認 $ cat main/current @400000005585dead3b225bec 308 @400000005585deae3b4ea7c4 309 @400000005585deaf3b8b85cc 310
参考
今回ためすにあたっては下記のサイトが大変参考になりました!thx!
まとめ
スニペット記事とかいっておきながらだいぶ長くなりましたが、
daemontoolsって今の情報でまとまってるところが少なかったのでいろいろ書いてみましたー!
enjoy!