daemontoolsでqmailのプロセスとログの管理を行う

私の環境では、qmailのプロセス監視や管理、ログをより信頼性高く管理するためdaemontoolsを導入しています。

その導入手順と使用方法をまとめました。
daemontoolsを導入するメリット、導入手順など下記サイトを参考にしています。
daemontoolsによるロギングとプロセス監視
 
本ページの目次
1)daemontoolsのインストール
2)daemontoolsの仕組み
3)daemontoolsで管理するqmailのプロセスについて
4)daemontoolsでqmail-send(配送)の起動、監視設定
5)daemontoolsでqmail-smtpdの起動、監視設定
6)daemontoolsでqmail-pop3dの起動、監視設定
  

1)daemontoolsのインストール


 
①ソースの入手
 
daemontools-0.76.tar.gzを入手します。
 
②/packageディレクトリの作成
 
# mkdir -p /package
# chmod 1755 /package

 
daemontools-0.76.tar.gzを/packageディレクトリに配置
 
③ソースの解凍
 
# gunzip daemontools-0.76.tar.gz
# tar -xpf daemontools-0.76.tar
# rm -f daemontools-0.76.tar

 
④インストール時のエラーを回避するためconf-cc修正
 
(実行例)
# vi /usr/local/src/admin/daemontools-0.76/src/conf-cc
 
訂正前 gcc -O2 -Wimplicit -Wunused -Wcomment -Wchar-subscripts -Wuninitialized -Wshado
-Wcast-qual -Wcast-align -Wwrite-strings
   ↓
訂正後 gcc -O2 -Wimplicit -Wunused -Wcomment -Wchar-subscripts -Wuninitialized -Wshado
-Wcast-qual -Wcast-align -Wwrite-strings -include /usr/include/errno.h
 
⑤インストール実行
 
(実行例)
# package/install
 
(実行結果)
  :
Creating /service…
Adding svscanboot to inittab…
init should start svscan now.

 
⑥起動設定の確認
 
/etc/inittabに下記設定が追加されています。
 
SV:123456:respawn:/command/svscanboot
 
これによって、サーバー起動時に自動でsvscanbootが実行されます。
 
⑦サービスの起動確認
 
# ps -ef | grep svscan
root 7028 1 0 Feb11 ? 00:00:00 /bin/sh /command/svscanboot
root 7030 7028 0 Feb11 ? 00:00:08 svscan /service
root 31659 30171 0 10:03 pts/2 00:00:00 grep svscan

 
⑧タイムスタンプツールの動作確認
 
# cd /command
# date | ./tai64n | ./tai64nlocal
2013-02-19 10:04:14.150693500 Tue Feb 19 10:04:14 JST 2013

 
左と右の時刻が同じである事を確認できました。
 

2)daemontoolsの仕組み


 
●daemontoolsを構成するプログラム
 
svscanboot :OS起動時にsvscanを開始する。
svscan   :/serviceディレクトリを監視し、superviseプロセスを開始。
supervise :サービスの開始、監視、再起動をする。
svc    :superviseによって監視されるサービスを制御する。
svok    : superviseが実行中か確認する。
svstat   : superviseによって管理されているサービスの状態を表示する。
 
●動作の概要
 
・ファイル構成例
/service
 svscan監視ディレクトリ
/service/qmail
 サブディレクトリ。このディレクトリ単位にsuperviceプロセス実行
/service/qmail/run
 superviceプロセスが制御するスクリプト(qmailの起動スクリプト)
/service/qmail/log/run
上記スクリプトにパイプで渡されるログの起動スクリプト
 
・superviseが常駐プロセスとして、サービス(qmailのプロセス)を常に監視。
 停止したらすぐに再起動する。
 
・svcは、superviseプロセスが管理しているサービスの開始、停止を行う。
 svcでサービスを停止した場合は、superviseによって再起動されない。
 
・svscanは常駐プロセスとして、superviseプロセスを開始。
 superviseプロセスが停止したら再起動する。
 
●svscanboot
 
・”/etc/inittab”に下記のように設定されていて、OS起動時に実行される。
 
SV:123456:respawn:/command/svscanboot
 
・svscanbootの処理内容
 
シェルスクリプトの処理内容
 
/command/svc -dx /service/* /service/*/log
svscan /service
 
●svscan
 
/serviceディレクトリを5秒置きに監視し、サブディレクトリがあったら、サブディレクトリ一つにつき一つのsuperviseを起動する。
 
上記サブディレクトリ内にlogディレクトリがあった場合は、パイプでつないでサービスのログを確実に取得できるようにする。
 
●supervise
 
・svscanによって自動で起動される。
 
・/superviseディレクトリ内のサブディレクトリ内にあるrunスクリプトを開始する。
 
・サブディレクトリ内にdownという名前のファイルがある場合は、runスクリプトを起動しない。
 
・サービスのスタータス情報をサブディレクトリ内の”supervise”ディレクトリ内で管理する。
 
●svc
 
書式
 svc オプション superviseで管理されるディレクトリ名
 
例)
・svc -u /service/qmail
  監視対象ディレクトリを/service/qmailとして開始。
 
・svc -d /service/qmail
  監視対象ディレクトリを/service/qmailとして停止。
 
オプション一覧

-u: Up. If the service is not running, start it. If the service stops, restart it.
-d: Down. If the service is running, send it a TERM signal and then a CONT signal.
   After it stops, do not restart it.
-o: Once. If the service is not running, start it. Do not restart it if it stops.
-p: Pause. Send the service a STOP signal.
-c: Continue. Send the service a CONT signal.
-h: Hangup. Send the service a HUP signal.
-a: Alarm. Send the service an ALRM signal.
-i: Interrupt. Send the service an INT signal.
-t: Terminate. Send the service a TERM signal.
-k: Kill. Send the service a KILL signal.
-x: Exit. supervise will exit as soon as the service is down. If you use this option on a stable system,
  you’re doing something wrong; supervise is designed to run forever.
 

3)daemontoolsで管理するqmailのプロセスについて


 
①SMTPリクエストを処理するプロセス
 
・qmail-smtpdがメッセージを受け取り、qmail-queueプロセスに渡す。
・デーモンとして常駐するのはtcpserverで、smtpメッセージを受信するとqmail-smtpdに制御を渡す。
 
②キューからメッセージを取り出し配送するプロセス
 
・qmail-sendがキューからメッセージを取り出し、qmail-lspawn,qmail-rspawnに渡す。
・”/var/qmail/rc”に記述された、”qmail-start”コマンドで起動して、qmail-send、qmail-lspawn、qmail-rspawnプロセスが常駐する。
 
③pop3リクエストを処理するプロセス
 
・qmail-pop3dが処理を行う。
・デーモンとして常駐するのはtcpserverで、popリクエストを受信するとqmail-pop3dに制御を渡す。
 

4)daemontoolsでqmail-send(配送)の起動、監視設定


 
①ディレクトリ、ファイル構成の確認
 
下記ディレクトリの構成で設定します。
 
/service
 daemontoolsのsvscan監視ディレクトリ
/service/qmail
 サブディレクトリ。このディレクトリ単位にsuperviceプロセス実行
/service/qmail/run
 qmail-sendプロセスの起動スクリプト   
/service/qmail/log/run
 上記スクリプトにパイプで渡されるログの起動スクリプト
 
②ディレクトリ作成
 
まず、/var/qmail/services配下に作成し、後で/service/qmailにシンボリックリンクします。
 
# mkdir /var/qmail/services
# mkdir /var/qmail/services/qmail
# mkdir /var/qmail/services/qmail/log
# chmod +t /var/qmail/services/qmail

 
③qmail-sendの起動スクリプト作成
 
# vi /var/qmail/services/qmail/run
 
(ファイルの中身)
#!/bin/sh
 
PATH=/var/qmail/bin:/usr/local/bin:/bin:/usr/bin
exec /var/qmail/rc
 
# vi /var/qmail/rc
 
(ファイルの中身)
#!/bin/sh
exec env – PATH=”/var/qmail/bin:$PATH” qmail-start ./Maildir/
 
④qmailのログの起動スクリプト
 
# vi /var/qmail/services/qmail/log/run
 
(ファイルの中身)
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail
 
ログを記録するプログラムが、/usr/local/bin/multilog
ログの作成は”qmail”ユーザーが行うようにし、
タイムスタンプの指定をするためのオプション、”t”
ログの出力先ディレクトリが、/var/log/qmail
としています。
 
⑤起動スクリプトに権限設定
 
# chmod +x /var/qmail/services/qmail/run
# chmod +x /var/qmail/services/qmail/log/run

 
⑥ログのディレクトリ作成
 
# mkdir /var/log/qmail
# chown qmaill:nofiles /var/log/qmail
# chmod 700 /var/log/qmail

 
⑦/serviceにシンボリックリンクを作成
 
# ln -s /var/qmail/services/qmail /service/qmail
 
作成すると、svscanが/serviceディレクトリを5秒置きに監視していますのでsuperviceプロセスが自動で起動します。
 
superviceプロセスは、/superviseディレクトリ内のサブディレクトリ内にあるrunスクリプトを開始するので、qmail-sendの起動スクリプトが実行されます。
 
⑧プロセスの起動確認
 
# ps -ef | grep qmail
 
root 5175 5123 0 22:06 pts/1 00:00:00 grep qmail
qmaill 26614 13720 0 Feb21 ? 00:00:00 /usr/local/bin/multilog t /var/log/qmail
root 26615 7030 0 Feb21 ? 00:00:00 supervise qmail
qmails 26642 26615 0 Feb21 ? 00:00:00 qmail-send
root 26643 26642 0 Feb21 ? 00:00:00 qmail-lspawn ./Maildir/
qmailr 26644 26642 0 Feb21 ? 00:00:00 qmail-rspawn
qmailq 26645 26642 0 Feb21 ? 00:00:00 qmail-clean

 
qmail-send、qmail-lspawn、qmail-rspawnが起動されました。
 

5)daemontoolsでqmail-smtpdの起動、監視設定


 
①ディレクトリ、ファイル構成の確認
 
下記ディレクトリの構成で設定します。
 
/service
 daemontoolsのsvscan監視ディレクトリ
/service/smtpd
 サブディレクトリ。このディレクトリ単位にsuperviceプロセス実行
/service/smtpd/run
 qmail-smtpdプロセスの起動スクリプト   
/service/smtpd/log/run
 上記スクリプトにパイプで渡されるログの起動スクリプト
 
②ディレクトリ作成
 
まず、/var/qmail/services配下に作成し、後で/service/smtpdにシンボリックリンクします。
 
# mkdir /var/qmail/services/smtpd
# mkdir /var/qmail/services/smtpd/log
# chmod +t /var/qmail/services/smtpd

 
③qmail-smtpdの起動スクリプト
 
# vi /var/qmail/services/smtpd/run
 
(ファイルの中身)
#!/bin/sh
PATH=/var/qmail/bin:/usr/local/bin:/bin:/usr/bin
tcpserver -v -u[qmaildのUID] -g[nofilesのGID]-x /etc/tcp.smtp.cdb \
0 smtp /var/qmail/bin/qmail-smtpd 2>&1
 
④qmail-smtpdのログの起動スクリプト
 
# vi /var/qmail/services/smtpd/log/run
 
(ファイルの中身)
#!/bin/sh
exec /usr/local/bin/setuidgid qmails /usr/local/bin/multilog t /var/log/smtpd
 
ログを記録するプログラムが、/usr/local/bin/multilog
ログの作成は”qmails”ユーザーが行うようにし、
タイムスタンプの指定をするためのオプション、”t”
ログの出力先ディレクトリが、/var/log/smtpd
としています。
 
⑤起動スクリプトに権限設定
 
# chmod +x /var/qmail/services/smtpd/run
# chmod +x /var/qmail/services/smtpd/log/run

 
⑥ログのディレクトリ作成
 
# mkdir /var/log/smtpd
# chown qmails:nofiles /var/log/smtpd
# chmod 700 /var/log/smtpd

 
⑦/serviceにシンボリックリンクを作成
 
# ln -s /var/qmail/services/smtpd /service/smtpd
 
作成すると、svscanが/serviceディレクトリを5秒置きに監視していますのでsuperviceプロセスが自動で起動します。
 
superviceプロセスは、/superviseディレクトリ内のサブディレクトリ内にあるrunスクリプトを開始するので、qmail-smtpdの起動スクリプトが実行されます。
 
⑧プロセスの起動確認
 
# ps -ef | grep smtpd
root 5748 7030 0 22:39 ? 00:00:00 supervise smtpd
qmails 5932 5749 0 22:40 ? 00:00:00 /usr/local/bin/multilog t /var/log/smtpd
qmaild 5934 5933 0 22:40 ? 00:00:00 tcpserver -v -u 504 -g 503 -x /etc/tcp.smtp.cdb 0 smtp /var/qmail/bin/qmail-smtpd

 
tcpserverによってqmail-smtpdが実行されています。
 

6)daemontoolsでqmail-pop3dの起動、監視設定


 
①ディレクトリ、ファイル構成の確認
 
下記ディレクトリの構成で設定します。
 
/service
 daemontoolsのsvscan監視ディレクトリ
/service/pop3d
 サブディレクトリ。このディレクトリ単位にsuperviceプロセス実行
/service/pop3d/run
 qmail-pop3dプロセスの起動スクリプト   
/service/pop3d/log/run
 上記スクリプトにパイプで渡されるログの起動スクリプト
 
②ディレクトリ作成
 
まず、/var/qmail/services配下に作成し、後で/service/pop3dにシンボリックリンクします。
 
# mkdir /var/qmail/services/pop3d
# mkdir /var/qmail/services/pop3d/log
# chmod +t /var/qmail/services/pop3d
 
③qmail-pop3dの起動スクリプト
 
# vi /var/qmail/services/pop3d/run
 
(ファイルの中身)
#!/bin/sh
PATH=/var/qmail/bin:/usr/local/bin:/bin:/usr/bin
exec tcpserver -v 0 pop3 /var/qmail/bin/qmail-popup [サーバのFQDN] \
/bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir 2>&1
 
④qmail-pop3dのログの起動スクリプト
 
# vi /var/qmail/services/pop3d/log/run
 
(ファイルの中身)
#!/bin/sh
exec /usr/local/bin/setuidgid qmailp /usr/local/bin/multilog t /var/log/pop3d
 
ログを記録するプログラムが、/usr/local/bin/multilog
ログの作成は”qmailp”ユーザーが行うようにし、
タイムスタンプの指定をするためのオプション、”t”
ログの出力先ディレクトリが、/var/log/pop3d
としています。
 
⑤起動スクリプトに権限設定
 
# chmod +x /var/qmail/services/pop3d/run
# chmod +x /var/qmail/services/pop3d/log/run

 
⑥ログのディレクトリ作成
 
# mkdir /var/log/pop3d
# chown qmailp:nofiles /var/log/pop3d
# chmod 700 /var/log/pop3d

 
⑦/serviceにシンボリックリンクを作成
 
# ln -s /var/qmail/services/pop3d /service/pop3d
 
作成すると、svscanが/serviceディレクトリを5秒置きに監視していますのでsuperviceプロセスが自動で起動します。
 
superviceプロセスは、/superviseディレクトリ内のサブディレクトリ内にあるrunスクリプトを開始するので、qmail-pop3dの起動スクリプトが実行されます。
 
⑧プロセスの起動確認
 
# ps -ef | grep pop3d
root 6012 7030 0 22:58 ? 00:00:00 supervise pop3d
qmailp 6014 6013 0 22:58 ? 00:00:00 /usr/local/bin/multilog t /var/log/pop3d
root 6015 6012 0 22:58 ? 00:00:00 tcpserver -v 0 pop3 /var/qmail/bin/qmail-popup pop.example.com /bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir

 
tcpserverによってqmail-pop3dが実行されています。

関連記事の目次

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です