maehachi08 Anything Blog

2012年04月24日
daemontoolsでデーモン監視(インストール編)

デーモン監視

Linuxではプログラムをバッググラウンドで稼動させる場合デーモンで実行することがあります。ApacheやMySQLなどのデーモンが停止すればサービス断の形ですぐに発覚しますが、目立たないサービスの場合はデーモンが落ちても気づかないこともあると思います。そんな時にデーモン監視ツールのdaemontoolsがシステム管理者に代わってデーモンのお守りをしてくれるでしょう。

daemontoolsとは

daemontoolsはqmailの開発者であるD. J. Bernstein氏により提供されているパッケージで、ロギング機能とプロセス監視機能を提供します。今回はプロセス監視機能に特化して記事にしたいと思います。プロセス監視機能とは、デーモンプロセスの開始、終了、再起動、プロセス停止時の自動起動といったことが可能になっています。

daemontoolsのインストール

daemontoolsダウンロードサイトからdaemontools-0.76.tar.gzをダウンロードし、インストールします。
daemontoolsのソースtarボールをダウンロードします。

# mkdir -p /package
# chmod 1755 /package
# cd /package

# wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
--2012-04-23 22:25:46--  http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
cr.yp.to をDNSに問いあわせています... 131.193.32.142, 80.101.159.118
cr.yp.to|131.193.32.142|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 36975 (36K) [application/x-gzip]
`daemontools-0.76.tar.gz' に保存中

100%[================================================>] 36,975      71.9K/s 時間 0.5s

2012-04-23 22:25:48 (71.9 KB/s) - `daemontools-0.76.tar.gz' へ保存完了 [36975/36975]

インストールします。64bitOSの場合はエラーが出るので、その後でconf-ccを修正します。

# tar xzvf daemontools-0.76.tar.gz

# cd admin/daemontools-0.76/

コンパイルでエラー発生!!
# package/install
 ・
 ・
 ・
./load envdir unix.a byte.a
/usr/bin/ld: errno: TLS definition in /lib64/libc.so.6 section .tbss mismatches non-TLS reference in envdir.o
/lib64/libc.so.6: could not read symbols: Bad value
collect2: ld はステータス 1 で終了しました
make: *** [envdir] エラー 1
Copying commands into ./command...
cp: cannot stat `compile/svscan': そのようなファイルやディレクトリはありません

# ls -l
合計 24
drwxr-xr-x 2 root root  4096  4月 23 22:46 command
drwxr-xr-x 3 root root 12288  4月 23 22:46 compile
drwxr-xr-x 2 root root  4096  7月 13  2001 package
drwxr-xr-x 2 root root  4096  4月 23 22:45 src

# cat compile/conf-cc
gcc -O2 -Wimplicit -Wunused -Wcomment -Wchar-subscripts -Wuninitialized -Wshadow -Wcast-qual -Wcast-align -Wwrite-strings

This will be used to compile .c files.

⇒ 64bitOSの場合はconf-ccを修正
# compile/conf-cc
(修正前)gcc -O2 -Wimplicit -Wunused -Wcomment -Wchar-subscripts -Wuninitialized -Wshadow -Wcast-qual -Wcast-align -Wwrite-strings
(修正後)gcc -O2 --include /usr/include/errno.h

⇒ 再度チャレンジ
# package/install
 ・
 ・
 ・
cat systype compile load >> sysdeps
grep sysdep direntry.h >> sysdeps
grep sysdep haswaitp.h >> sysdeps
grep sysdep hassgact.h >> sysdeps
grep sysdep hassgprm.h >> sysdeps
grep sysdep select.h >> sysdeps
grep sysdep uint64.h >> sysdeps
grep sysdep iopause.h >> sysdeps
grep sysdep hasmkffo.h >> sysdeps
grep sysdep hasflock.h >> sysdeps
grep sysdep hasshsgr.h >> sysdeps
Copying commands into ./command...
Creating symlink daemontools -> daemontools-0.76...
Making command links in /command...
Making compatibility links in /usr/local/bin...
Creating /service...
Adding svscanboot to inittab...
init should start svscan now.

インストール後の環境確認

daemonttolsをインストールすると/(ルート)直下にcommandディレクトリとserviceディレクトリが作成されます。

# ls -ld /service /command
drwxr-xr-x 2 root root 4096  4月 23 23:44 /command
drwxr-xr-x 2 root root 4096  4月 23 22:46 /service

/package/admin/daemontools/commandディレクトリの実行ファイル群のシンボリックリンクが作成されます。また、/commandディレクトリの実行ファイル群のシンボリックリンクはが/usr/local/binディレクトリにも作成されます。

# ls -l /command/
合計 0
lrwxrwxrwx 1 root root 41  4月 23 23:44 envdir -> /package/admin/daemontools/command/envdir
lrwxrwxrwx 1 root root 44  4月 23 23:44 envuidgid -> /package/admin/daemontools/command/envuidgid
lrwxrwxrwx 1 root root 41  4月 23 23:44 fghack -> /package/admin/daemontools/command/fghack
lrwxrwxrwx 1 root root 43  4月 23 23:44 multilog -> /package/admin/daemontools/command/multilog
lrwxrwxrwx 1 root root 43  4月 23 23:44 pgrphack -> /package/admin/daemontools/command/pgrphack
lrwxrwxrwx 1 root root 48  4月 23 23:44 readproctitle -> /package/admin/daemontools/command/readproctitle
lrwxrwxrwx 1 root root 42  4月 23 23:44 setlock -> /package/admin/daemontools/command/setlock
lrwxrwxrwx 1 root root 44  4月 23 23:44 setuidgid -> /package/admin/daemontools/command/setuidgid
lrwxrwxrwx 1 root root 44  4月 23 23:44 softlimit -> /package/admin/daemontools/command/softlimit
lrwxrwxrwx 1 root root 44  4月 23 23:44 supervise -> /package/admin/daemontools/command/supervise
lrwxrwxrwx 1 root root 38  4月 23 23:44 svc -> /package/admin/daemontools/command/svc
lrwxrwxrwx 1 root root 39  4月 23 23:44 svok -> /package/admin/daemontools/command/svok
lrwxrwxrwx 1 root root 41  4月 23 23:44 svscan -> /package/admin/daemontools/command/svscan
lrwxrwxrwx 1 root root 45  4月 23 23:44 svscanboot -> /package/admin/daemontools/command/svscanboot
lrwxrwxrwx 1 root root 41  4月 23 23:44 svstat -> /package/admin/daemontools/command/svstat
lrwxrwxrwx 1 root root 41  4月 23 23:44 tai64n -> /package/admin/daemontools/command/tai64n
lrwxrwxrwx 1 root root 46  4月 23 23:44 tai64nlocal -> /package/admin/daemontools/command/tai64nlocal

# ls -l /usr/local/bin/ | grep "/command"
lrwxrwxrwx 1 root root      15  4月 23 23:44 envdir -> /command/envdir
lrwxrwxrwx 1 root root      18  4月 23 23:44 envuidgid -> /command/envuidgid
lrwxrwxrwx 1 root root      15  4月 23 23:44 fghack -> /command/fghack
lrwxrwxrwx 1 root root      17  4月 23 23:44 multilog -> /command/multilog
lrwxrwxrwx 1 root root      17  4月 23 23:44 pgrphack -> /command/pgrphack
lrwxrwxrwx 1 root root      22  4月 23 23:44 readproctitle -> /command/readproctitle
lrwxrwxrwx 1 root root      16  4月 23 23:44 setlock -> /command/setlock
lrwxrwxrwx 1 root root      18  4月 23 23:44 setuidgid -> /command/setuidgid
lrwxrwxrwx 1 root root      18  4月 23 23:44 softlimit -> /command/softlimit
lrwxrwxrwx 1 root root      18  4月 23 23:44 supervise -> /command/supervise
lrwxrwxrwx 1 root root      12  4月 23 23:44 svc -> /command/svc
lrwxrwxrwx 1 root root      13  4月 23 23:44 svok -> /command/svok
lrwxrwxrwx 1 root root      15  4月 23 23:44 svscan -> /command/svscan
lrwxrwxrwx 1 root root      19  4月 23 23:44 svscanboot -> /command/svscanboot
lrwxrwxrwx 1 root root      15  4月 23 23:44 svstat -> /command/svstat
lrwxrwxrwx 1 root root      15  4月 23 23:44 tai64n -> /command/tai64n
lrwxrwxrwx 1 root root      20  4月 23 23:44 tai64nlocal -> /command/tai64nlocal

/etc/inittabの末尾に以下の1行が追記されます。

⇒ インストールが完了すると/直下に2つのディレクトリが作成されます。
```bash
# tail -1 /etc/inittab
SV:123456:respawn:/command/svscanboot

プロセスを確認すると、/command/svscanbootが実行されています。
readproctitle service errorsと表示されていますが、正常な状態だということです。

# ps auxf
root     15448  0.0  0.0  10764  1196 ?        Ss   Apr23   0:00 /bin/sh /command/svscanboot
root     15450  0.0  0.0   3832   408 ?        S    Apr23   0:00  \_ svscan /service
root     15451  0.0  0.0   3648   324 ?        S    Apr23   0:00  \_ readproctitle service errors: ..........................................................
.............................................................................................................................................................
.............................................................................................................................................................
............................