rootのcrontabと/etc/cron.{daily,hourly,weekly,monthly}の違い

/etc/cron.daily に配置すると、rootのcrontabに書いた場合といくつかの違いがある。

serverfault.com

たとえば、$HOME という環境変数//root という形で異なったりする。 スクリプトの冒頭で $HOME/.bashrc とかやっていると失敗するので、なるべく紛れのない形式で書くようにする。

他にもcronは、通常のログインシェルでは問題なく動いていたスクリプトが失敗したりして、ハマりやすい点が多い。 代表的なのは以下のあたり。

  • 環境変数がほとんど設定されない (HOME, SHELLくらい)
  • ログイン設定 (.bashrcとか) が設定されない
  • エラーが出ない。mailで送られたりするので、ちゃんと設定されていればいいが、そうでなければログファイルにリダイレクトしておく必要がある。
  • terminalが割り当てられない (前回の記事 http://ikeas.hatenablog.com/entry/2015/08/14/032349)

ほかにも、cronでの失敗例はやまほどあるはず。しかもエラーが分かるのが実際に実行された後なので、一度失敗して、修正して、また別のところで失敗して、修正して、、、、時間ばかりが経っていくというループはよく陥いる。

run-parts コマンドあたりを駆使すればうまくテストできそうな気がするが、これは未検証。