社内メールサーバに障害が起こっていたが、Cyrus IMAPdのDBのログのownerがrootになっていて書けないという原因だった。
/etc/init.d/cyrus-imapd stop
chown cyrus.imap /var/lib/imap/db/*
/etc/init.d/cyrus-imapd start
とやって、 再びstartさせたら治ったが、ログを見る限りでは、DBのログローテーションタイミングで、ctl_cyrusdbが新たに作成したログへの書き込みに失敗しているという感じ。
Web検索すると、Macの事例がちょこっと読めたりするのだが、英語のメーリングリストまで当たってみても、具体的にどういう対策を採れば解決するのかという情報は皆無で、バージョンは今2.2.12だが、2.3.xに上げたとしても直る保証がない。
何しろ、DBのログローテーションのタイミングで起こるので、よっぽど大量のメールを処理してても滅多に起こるものでもない。しかし、休日に呼び出されるのも嫌なので、ログを監視して自動復旧するツールを作った。
昔、perlでpppのログ監視して、pppが切断されたら再upとか、PCMCIAのAirH”カードを再初期化するツールを作っていたので、その応用で、maillogを監視し、ctl_cyrusdb\[\d+\]:.*DBERROR.*Permission denied ってのに反応するようにした。
Cyrus のdeliverはIMAPdでスプールできないと/var/spool/mailに落としてくれるので、
formail -d -s sendmail hoge</var/spool/mail/hoge
とかやると、落っことしたメールを再配送できる。
監視ツールでは、この再配送までを自動でやるようにしてはいるが、実際に障害が起こらないとうまく動くかは分からないんだなこれが(笑)