fetchmail.logにlogrotateを仕掛けるとサービスが停止する・・・
root 権限で回している fetchmail のサービスのログが結構な勢いで肥大化するので logrotate を仕掛けたら、ログがローテーションされるタイミングで何故かサービスが止まってしまう問題にぶち当たったのでその対策なんかを書いておこうと思います。
やりたいことは、「一週間に一回ログを切り捨てて、そのタイミングでサービスをリスタートする。」という至ってシンプルな内容ですが、logrotate を仕掛けたところログは切り捨てられるけど、サービスが止まってしまう現象が発生しました。
で、設定が悪いのかと思い、色々とテストをするのですが crontab で設定した場合は上手く行くのに、なぜか cron.daily で実行された場合のみ上手くいかないという、良く分からない状況になってしまい、何日かはまりました...
最終的には動くようになりましたけど、なんで cron.daily だと動かなかったのかは未だに謎です。
もともと設定していた logrotate の設定 /etc/logrotate.d/fetchmail は以下のような感じです。
/var/log/fetchmail.log { weekly rotate 4 missingok postrotate /etc/rc.d/init.d/fetchmail restart endscript }
まぁ、普通ですよね。
postrotate の出力を null に落としてないのは単純に面倒だったからというのもありますが、しばらく動作確認をするためという意味もあります。
が、これだとログはローテーションされますが、サービスが止まった状態になってしまいました。
なので、試しに weekly じゃなくて size=10 のように指定し、crontab で以下のように設定し実行してみたのですが、問題なくローテーションされ、サービスも正常に再起動します。
ここからは色々と試したのですが、以下のように出力を null に落としてもサービスは起動しません。
postrotate /etc/rc.d/init.d/fetchmail restart > /dev/null endscript
結構はまってしまったのですが、色々とテストしているときに root 宛のメールの中に以下のようなメッセージを発見!
/etc/cron.daily/logrotate:
fetchmail for root stoping...(PID=27786)
fetchmail: 警告: root アカウントでの実行はお薦めできません。
fetchmail: バックグラウンドの fetchmail (PID=27786) が終了しました。
fetchmail for root starting...
fetchmail: 警告: root アカウントでの実行はお薦めできません。
fetchmail: メールサーバが指定されておりません。
つまり、設定ファイルが読み込めてないってことなんですよね、たぶん。。。
っということで、/etc/logrotate.d/fetchmail を以下のように修正してみました。
/var/log/fetchmail.log { weekly rotate 4 missingok postrotate /etc/rc.d/init.d/fetchmail stop /usr/bin/fetchmail -f /root/.fetchmailrc endscript }
restart じゃなくて stop で一旦止めてから、設定ファイルを指定して起動させています。
なぜ crontab ではこの書き方が必要なくて cron.daily とかだと必要なのかは良く分かりません。
ただ、この書き方だと cron.daily でも正常に起動することがわかりました。
うーん、謎です。
権限が違うんですかねぇ?
よくわかりません。
コメント