だるろぐ

だるいぶろぐです

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を / に設定しているためだった。

  1. そもそもlogrotateはcron.dailyから実行されている
  2. cron.dailyはcrontabから実行されている

ってとこから辿ればすぐですね。今回のミスは、手動でアプリの再起動、logrotateを行って検証してたこと。
というわけで、lighttpdのconfの中でHOMEを指定してやることで解決。はあ、長かった。
crontabの中でHOMEをいじるのは、他に影響しそうだから回避。