私の環境では、qmailのプロセス監視や管理、ログをより信頼性高く管理するためdaemontoolsを導入しています。
その導入手順と使用方法をまとめました。
daemontoolsを導入するメリット、導入手順など下記サイトを参考にしています。
daemontoolsによるロギングとプロセス監視
※目次をクリックすると目次の下部にコンテンツが表示されます。
- 1.daemontoolsのインストール
- 2.daemontoolsの仕組み
- 3.daemontoolsで管理するqmailのプロセスについて
- 4.daemontoolsでqmail-send(配送)の起動、監視設定
- 5.daemontoolsでqmail-smtpdの起動、監視設定
- 6.daemontoolsでqmail-pop3dの起動、監視設定
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
左と右の時刻が同じである事を確認できました。
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.
・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に制御を渡す。
下記ディレクトリの構成で設定します。
/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が起動されました。
下記ディレクトリの構成で設定します。
/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が実行されています。
下記ディレクトリの構成で設定します。
/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が実行されています。