LoginSignup
26
18

More than 1 year has passed since last update.

Crontab で source ~/.bashrc や bash -l を使うと死を招く

Last updated at Posted at 2017-10-17

大げさな表現を使いましたが、以下のように crontab で bash -lsource ~/.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 ~/.bashrcbash -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 を気兼ねなく書き換えられるようになります。

26
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
18