logrotateでapache/lighttpdの再起動時の%ENV
ハマった。
現象
こめったーで、Config::Pitを使って値を取得する処理が、logrotateによる再起動を行った後だけ失敗する。
HTTP::Engineを使ったサーバスクリプト使用時や、手作業による再起動を行った後では失敗しない。
Config::Pitのソースを読んで最初に疑ったのは、Config::Pit(以下pit)が値を取得するとき、実行ユーザのHOMEから取得していることから、sudoを用いての再起動や、rootが直に再起動を行ったときは、HOMEが変わるから取得出来てないんじゃないか、と。
開発時からずっと、開発ユーザのHOMEにpitのファイルを保存していた。なので、最初はこうしてみた。
ln -s /home/developer/.pit /root/.pit
これだと、sudoで再起動したら正常動作するんだけど、logrotateの再起動後は失敗する。
logrotateでやっているのは
LIGHTTPD_CONF_PATH="/var/www/commetter/config/lighttpd/commetter.conf" /etc/init.d/lighttpd restart
なので、これをsudoやrootで実行し、%ENVを確認するも、HOMEにはちゃんと /root が入っている。なら成功するはずじゃん!とハマってた。
また、logrotateのログを編集し、こめったーだけローテートされるようにし、
/usr/sbin/logrotate /etc/logrotate.d/commetter
をsudo/rootで実行しても同じ結果。
で、原因。
/etc/crontab で、HOMEを / に設定しているためだった。
- そもそもlogrotateはcron.dailyから実行されている
- cron.dailyはcrontabから実行されている
ってとこから辿ればすぐですね。今回のミスは、手動でアプリの再起動、logrotateを行って検証してたこと。
というわけで、lighttpdのconfの中でHOMEを指定してやることで解決。はあ、長かった。
crontabの中でHOMEをいじるのは、他に影響しそうだから回避。