23 December 2015

(Linux) MediaTombのlogrotateでエラーが出ないよう修正

logrotateで毎週次のようなエラーが出る (root宛にメールが送られてくる)。もちろん、logrotateをコマンドラインから実行しても同じ状況だ

/etc/cron.daily/logrotate:
error: error running non-shared postrotate script for /var/log/mediatomb.log of '"/var/log/mediatomb.log" '
run-parts: /etc/cron.daily/logrotate exited with return code 1

デバッグ実行

コマンドラインで強制的にlogrotateを実行してデバッグするには、まず前回の実行歴を無理やり修正して

/var/lib/logrotate/status
logrotate state -- version 2
"/var/log/upstart/*.log" 2015-12-23-17:0:0
 〜 略 〜
"/var/log/mediatomb.log" 2015-12-01-17:27:23
 〜 略 〜

コマンドラインから次のように実行する。もちろん、エラーメッセージもコマンドラインに返ってくる。

$ sudo /usr/sbin/logrotate /etc/logrotate.conf
error: error running non-shared postrotate script for /var/log/mediatomb.log of '"/var/log/mediatomb.log" '

原因追求と問題修正

mediatombのログローテーション設定ファイルを開いてみる

/etc/logrotate.d/mediatomb
"/var/log/mediatomb.log" {
        weekly
        rotate 4
        missingok
        postrotate
               pkill -HUP mediatomb
        endscript
}

問題は、おそらくmediatombが実行されていない時にpkill -HUPでメッセージを送ってしまうからだ。

mediatombのプロセスが動いている時だけ、pkill -HUPを行うよう、コマンドを少しいじってみる

/etc/logrotate.d/mediatomb
"/var/log/mediatomb.log" {
        weekly
        rotate 4
        missingok
        postrotate
                [ -n "$(pgrep -x mediatomb)" ] && pkill -HUP mediatomb
        endscript
}

これで、mediatombプロセスが存在するときのみ、pkill -HUPのシグナルが送信されるようになり、ログローテーション時のエラーも消滅する

今回の教訓

起動時に「自動的にデーモンとして実行」されるものを、ユーザの都合で「手動で開始」に変更している場合は、注意すること