大げさな表現を使いましたが、以下のように crontab で bash -l
や source ~/.bashrc
を使うのはアンチパターンだと思います。
# BAD
0 8 * * * /bin/bash -l -c 'my_daily_batch.sh'
# BAD
0 18 * * * source ~/.bashrc && 'my_evening_batch.sh'
なぜ ~/.bashrc
を読み込みたいのか
周知の通り Cron はコマンドを ~/.bashrc
を読み込んでいない環境で実行するのですが、これは初心者泣かせでもあります:
「コマンドラインだと成功するのに、cronだとエラーになるんです!どうしたらいいですか!?」
そして、ググって最初に見つけるのが source ~/.bashrc
や bash -l
を使う方法です。まぁ、それでうまく動くかもしれません。当面の間は・・・。
~/.bashrc
を読み込むと何が困るのか
~/.bashrc
に手を加える時の影響範囲が大きくなるからです。
ログイン時のシェルなどでも使うものなので「Ruby 2.4 を使うよう$PATH
を変えよう」などと変更するのはよくあることです。
しかし、それが Cron のジョブを失敗させてしまうかもしれません。悪いことに、~/.bashrc
を見ただけでは、それが crontab から読み込まれているのが分かりません。
代替案
cron 用に別の設定ファイルを用意しましょう。ジョブごとに別々に設定ファイルを作るとベター。
# GOOD
0 8 * * * source ~/cronjobs/env/my_daily_batch.env.sh && my_daily_batch.sh
0 18 * * * source ~/cronjobs/env/my_evening_batch.env.sh && my_evening_batch.sh
これで、~/.bashrc
を気兼ねなく書き換えられるようになります。