tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

centos6.5にdaemontoolsいれてプロセス監視するメモ - svscan起動したりsupervise監視(svc、svstat)したりmultilog出してみたり

はじめに

daemontools自体はけっこー古いものなので情報はいっぱいありますが、
starmanとMojoliciousを立ち上げる際に久しぶりに入れたのでついでにメモ。

今回自分はdaemontools経由でstarmanからmojoliciousアプリを起動し
nginxでプロキシする的なメモを書いた際にdaemontoolsのところが長くなったので、
肉付けして切り出したスニペット記事にするための記事としてみました。

※ 書いてたら思ってた以上に長くなった。。。

アジェンダ

  1. daemontoolsとは
  2. daemontoolsダウンロード&インストール
  3. svscanを起動
  4. daemon監視するserviceを作ってsvstatで確認してみる
  5. svcコマンドを使って見る
  6. serviceの止め方
  7. multilogを設定する

1. daemontoolsとは

この辺はいつもどおり自分の説明力に自信がないので、安定の引用で。

daemontoolsとは、デーモンを監視するツールのことです。
デーモンが不意にストップしたとき、それは止まったままになります。
しかし daemontools によって監視させておけば、 自動的に再起動してくれます。

参考 : daemontools によるプロセス監視

メリット

最近はdaemontoolsではなくSupervisorの記事も多いですが、
とはいえぐぐると何かとdaemontoolsで監視みたいな記事はまだ多く見かけるので
参考にしたまんまの流れで入れてしまいがちですが、
使うにあたってのメリットもそれとなーくレベルでも覚えておきたいので引用メモ

  • syslogと異なりソケットの代わりにパイプを使用するため、ログが確実に取れる
  • ログの容量を監視してくれる。ログのローテーションは日付ではなく、ある一定容量に達したかどうかによって行われる
  • サービスの追加・削除が簡単にできる。システム起動時に自動的に開始するか否かも簡単に指定できる
  • サービスを監視するためのロックファイルを作らなくて済む
  • デーモンのPIDを直接調べなくてもシグナルが送れる。daemontoolsを使って走らせた各デーモンはPIDではなく名前で指定でき、複数のデーモンにシグナルを送ることも可能
  • 起動するデーモンごとにlimitがかけられる。これにより、メモリ使用量やユーザー権限を制限できる

参考 : daemontoolsによるロギングとプロセス監視 (1/3)

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を作って確認します。
やることは下記。

  • service用ディレクトリとrunファイルを作成する
  • /service配下にシンボリックリンクを貼る
  • 権限変えつつsvstatでdaemon監視状況を確認する

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 seconds0 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配下の指定

svcsvstatワイルドカード指定もできます

$ 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!