- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:cronの挙動について)
cronの挙動について
このQ&Aのポイント
- cronの挙動について教えてください。cronでコマンドを実行する場合、.bashrcは明示的に実行しなければいけないのでしょうか。
- cron経由でコマンドが実行できない状態(/var/log/cronにコマンドを実行した履歴は残っています)でした。
- スクリプトの先頭で.bashrcをsourceコマンドで実行するようにしたところ、cronからも起動できるようになりました。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
man bashでbashのマニュアルが見られます。「起動」というセクションを読むと、~/.bashrc を読むのは、「ログインシェルでない対話的シェル」の時だけだとわかります。 cronから実行されるシェルは対話型ではありませんので、~/.bashrcは読み込まれません。 >cronで実行される場合、ログインした状態と同じ環境で実行されるとばかり思っていたため ログインシェルは、~/.bashrc でないいろいろなファイルを読みます。詳しくは、man bash の「起動」のセクションを参照。 >cronでコマンドを実行する場合、.bashrcは明示的に実行しなければいけないのでしょうか。 .bashrcには対話シェルで必要な設定をいろいろ書くので、cronから起動されるスクリプトでは、普通は source ~/.bashrc はせず、必要な環境変数の設定を個別に書きます。あるいは、PATHの設定程度なら、crontabファイル自体に書きます(man 5 crontab 参照)。 多数のcron起動スクリプトで全く同じ環境変数設定が必要であるような状況では、別途、~/.setenv 等のファイルを書いて、それをsourceするようにします。 .bashrcには端末入出力を伴なうコマンドを書くこともあり、非対話シェルから実行するのはトラブルの元です。
お礼
とても分かりやすい回答ありがとうございます。 確かに、.bashrcには、cronで実行するものに不必要なものも沢山宣言されています。 (というより必要なものはごくわずかです) また、容易にユーザが変更可能な.bashrcをcronで読み込むのは確かにトラブルの元になると思います。 .bashrcに定義されている、パス、環境変数のうち必要なものだけをスクリプトで定義するようにしようと思います。