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

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

その導入手順と使用方法をまとめました。
daemontoolsを導入するメリット、導入手順など下記サイトを参考にしています。
daemontoolsによるロギングとプロセス監視
 
※目次をクリックすると目次の下部にコンテンツが表示されます。

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

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

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.

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に制御を渡す。

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が起動されました。

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が実行されています。

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が実行されています。

関連記事の目次

コメントを残す

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