連載
» 2002年05月21日 00時00分 公開

実用qmailサーバ運用・管理術(9):daemontoolsによるロギングとプロセス監視 (2/3)

[鶴長鎮一,@IT]

rcスクリプトからの移行

 実際にqmailの起動をrc起動スクリプトから置き換えてみましょう。基となるrcスクリプトには次のものを使います。POP Before SMTPやIMAP4、vpopmailなどさまざまなアドオンパッケージをインストールし、rc起動スクリプトも複雑になってきていますが、svscanへの移行方法はほとんど変わりません。tcpserverを併用することも当然可能です。

  start)
        # Start daemons.
        echo "Starting qmail."
        #Start qmal
        csh -cf '/var/qmail/rc &' 
        # Start qmail-smtpd
        tcpserver -v -u[qmaildのUID] -g[nofilesのGID]-x /etc/tcp.smtp.cdb \ 
        0 smtp /var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd 3 &
        # Start qmail-pop3d
        tcpserver -v 0 pop3 /var/qmail/bin/qmail-popup [サーバのFQDN] /bin/checkpassword \ 
        /var/qmail/bin/qmail-pop3d Maildir 2>&1 \
                    | /var/qmail/bin/splogger pop3d 3 &
        echo
        touch /var/lock/qmail
        ;;
基になるrc起動スクリプト

 上記のrc起動スクリプトに代表されるように、大抵のものは以下の3つのセクションで構成されます。

(1)/var/qmail/rcの起動

(2)qmail-smtpdの起動

(3)qmail-pop3dまたはそのほかのpop3d/imapdの起動

 svscanへの置き換え、ロギング機能の強化の手順は3つのセクションでほぼ共通して行えます。では順を追って見ていきましょう。

/var/qmail/rcの置き換え

 必要なディレクトリを用意します。前述のように、直接/serviceディレクトリで作業を行わず/var/qmail/serviceで準備することにします。

# mkdir /var/qmail/services
# mkdir /var/qmail/services/qmail
# mkdir /var/qmail/services/qmail/log
# chmod +t /var/qmail/services/qmail

 次にrunスクリプトを作成し、実行権を設定します。

#!/bin/sh
PATH=/var/qmail/bin:/usr/local/bin:/bin:/usr/bin
exec /var/qmail/rc
/var/qmail/services/qmail/run

#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail
/var/qmail/services/qmail/log/run

# chmod +x /var/qmail/services/qmail/run
# chmod +x /var/qmail/services/qmail/log/run

 multilogを使用する際、既存のsploggerを使用しないように、rcスクリプト中の余分な記述を削除する必要があります。sploggerの記述を削除した/var/qmail/rcは次のようになります(sploggerの指定がない場合は作業を省略できます)。

#!/bin/sh
exec env - PATH="/var/qmail/bin:$PATH" \
qmail-start ./Maildir/
/var/qmail/rc

 ここでのログの作成はqmaillユーザーが行うようにするため、setuidgidコマンドに「qmaill」を引数として渡します。setuidgidはそのつづりのとおり、引数で渡されたアカウントのUIDとGIDで別のプログラムを起動します。

 multilogの引数には、ログ各行の先頭にTAI64N形式のタイムスタンプを付けるように「t」を指定し、次に出力先を指定します。multilogのデフォルトでは、ファイルサイズが99999bytesになるとファイルのローテーションを行い、最大ファイル数10まで保管します。それ以上になった場合は、古いものから削除します。

 最大ファイルサイズ、最大ファイル保持数を変更するには次のようにします。

# multilog t sサイズ nファイル数 /var/log/qmail
注:ファイルサイズは4096〜16777215の間で指定します。なお、ログを意味のないところで切らないために、最大ファイルサイズの最後の2000bytes以内に改行コードがあった場合にのみ、ログファイルのローテーションを行います

 multilogのそのほかの引数については、http://www.emaillab.org/djb/tools/daemontools/multilog.htmlを参照してください。

 次にログの出力先を作成し、適切なパーミッションを設定します。ここでのログ出力は、オーナーを「qmaill」、グループを「nofiles」にしておきます。

# mkdir /var/log/qmail
# chown qmaill:nofiles /var/log/qmail
# chmod 700 /var/log/qmail

 以上の作業がすべて完了した時点で、/serviceにシンボリックリンクを作成します。間髪を入れずにqmailがsuperviseの監視下で動作していることが分かります。

# ln -s /var/qmail/services/qmail /service/qmail
「ps -aef | grep qmail」などで確認

 svstatコマンドを使用しても起動の確認が行えます。

# svstat /service/qmail
/service/qmail: up (pid 1390) 5357 seconds

# svstat /service/qmail/log/
/service/qmail/log/: up (pid 1391) 5361 seconds

 uptimeが0や1を繰り返している場合は、runスクリプトの起動に失敗していることが考えられるので、/var/qmail/logに作成されたログを頼りにタイプミスなどがないか確認します。

qmail-smtpdの置き換え

 次に、rc起動スクリプトのセクション(2)を置き換えましょう。同様の作業を繰り返します。

 起動ディレクトリを用意します。

# mkdir /var/qmail/services/smtpd
# mkdir /var/qmail/services/smtpd/log
# chmod +t /var/qmail/services/smtpd

 runスクリプトを準備します。ログの作成はqmailsユーザーで行うようにします。

#!/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
/var/qmail/services/smtpd/run
注:| /var/qmail/bin/splogger smtpd 3 &は削除

#!/bin/sh
exec /usr/local/bin/setuidgid qmails /usr/local/bin/multilog t /var/log/smtpd
/var/qmail/services/smtpd/log/run

# 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
# svstat /service/smtpd/
/service/smtpd/: up (pid 3280) 425 seconds

# svstat /service/smtpd/log/
/service/smtpd/log/: up (pid 1510) 1179 seconds

qmail-pop3dの置き換え

 最後にセクション(3)を置き換えましょう。同じように、起動ディレクトリを準備します。

# mkdir /var/qmail/services/pop3d
# mkdir /var/qmail/services/pop3d/log
# chmod +t /var/qmail/services/pop3d

 runスクリプトを用意し、スクリプトに実行権を設定します。ログの作成はqmailpユーザーで行うようにします。

#!/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
/var/qmail/services/pop3d/run
注:| /var/qmail/bin/splogger pop3d 3 &は必要なし

#!/bin/sh
exec /usr/local/bin/setuidgid qmailp /usr/local/bin/multilog t /var/log/pop3d
/var/qmail/services/pop3d/log/run

# 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
# svstat /service/pop3d
/service/pop3d: up (pid 3458) 49 seconds

# svstat /service/pop3d/log
/service/pop3d/log: up (pid 3460) 53 seconds

 ほぼ同じ作業を3回こなすことで、置き換えのコツもつかめてきたと思います。ディレクトリの作成やパーミッションの設定は多少手間ですが、それによって得られる恩恵は手間以上のものです。

プロセスの停止と起動

 superviseでプロセスの監視を行うメリットとして、プロセスの起動や停止が簡単に行えることが挙げられます。プロセスを一時的に停止し、その後再開するような場合はsvcコマンドを次のように使用します。

# svc -d /service/サービス
停止させる場合

# svc -u /service/サービス
開始する場合

 この場合でも、サーバが再起動してしまうとsvscanが/serviceディレクトリを探索し、一時停止されていたサービスを再び起動します。サーバ再起動後もサービスを停止しておくには「/service/サービス」ディレクトリに「down」というファイルを作成します。中身は空のままで構いません。

# touch /service/サービス/down

 この方法でプロセスを停止できるのはsvscan起動時のみで、プロセスがすでに立ち上がっている場合はsvcコマンドを使用することを忘れないでください。

 一時停止でsvstatを実行すると、次のような結果が返ってくるはずです。

# svstat /service/サービス
/service/サービス: down 40 seconds, normally up

プロセスの削除

 プロセスが二度と起動されないようにする(サービスを削除する)には、/serviceディレクトリからサービスを定義したサブディレクトリを削除し、サーバを再起動するのが最も簡単です。ただし、サービスを提供しているサーバを簡単に再起動することはできません。そこで、次の手順を取ります。

 まず、先ほどの一時停止の手段でサービスを停止します。次に、サービスを定義したサブディレクトリの名前を「.」(ピリオド)で始まるものに変更します。その後、superviseに終了シグナルを送ります。前半のqmail-pop3dを例に取ると、次のようになります。

  • サービスの一時停止(qmail-pop3d、multilogの両プロセスを忘れずに停止させること)
# svc -d /service/pop3d/log
# svc -d /service/pop3d

  • サービスを定義したディレクトリ名の変更
# mv /service/pop3d /service/.pop3d

  • superviseに終了シグナルを送る
# svc -x /service/.pop3d/log
# svc -x /service/.pop3d

 -xオプションは、superviseに対して監視しているプロセスが終了次第supervise自身も終了するように指示するものです。この状態でのsvstatの結果は次のようになります。

# svstat /service/.pop3d
/service/.pop3d/log: supervise not running

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。