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
のシグナルが送信されるようになり、ログローテーション時のエラーも消滅する
今回の教訓
起動時に「自動的にデーモンとして実行」されるものを、ユーザの都合で「手動で開始」に変更している場合は、注意すること