現象
とある rails アプリケーションのログローテートを設定していたが思ったように圧縮してくれない場合があった。
/path/to/app/log/*.log {
daily
rotate 7
dateext
missingok
compress
su ec2-user ec2-user
sharedscripts
postrotate
puma_pid=/path/to/app/tmp/pids/puma.pid
test -e $puma_pid && kill -USR2 $(cat $puma_pid)
endscript
}
logrotate -f
で強制的に実行してみると以下のようなエラーが出ていた。
error: error running shared postrotate script for '/path/to/app/log/*.log '
原因
以下のように puma.pid ファイルが存在する場合に puma の再起動を行う記述がまずいらしい。
test -e $puma_pid && kill -USR2 $(cat $puma_pid)
上記だと、test -e $puma_pid
でファイルの存在チェックを行って、存在しない場合はそのままスクリプトが終了するが、そのときの exit コードが 1 (異常) となって圧縮処理が行われない。
それを回避するため以下のように記述
test -e $puma_pid && kill -USR2 $(cat $puma_pid) || true
上記のように、ファイルが存在せず再起動を実行しなかった場合は true
を呼び出して exit コードを 0 (正常) にする。
これで想定どおりに圧縮されるようになった。