web-dev-qa-db-ja.com

crontabの実行には、実行中のユーザーと同じ環境変数はありません

Crontabジョブを実行しました0 2 */1 * * /aScript >aLog.log 2>&1を「root」ユーザーとして使用しましたが、envが「root」ユーザーのenvとは異なるため、スクリプトの実行時の動作が異なります。

修正の試みは、rc.dファイルにエクスポートコマンドを配置することでしたが、それでも表示されませんでした! aScript自体にエクスポートコマンドを配置します。

私の質問は、この問題に取り組むより良い方法があるということですか?そして、同じユーザー「root」からのものであるにもかかわらず、envが欠落しているのはなぜですか? (ルートから「crontab -e」を実行してcrontabを変更します)

24
Bamboo

Cronは常にほとんど空の環境で実行されます。 HOMELOGNAME、およびShellが設定されています。そして非常に限られたPATH。したがって、cronを使用する場合は、実行可能ファイルへの完全なパスを使用し、スクリプトで必要な変数をエクスポートすることをお勧めします。

cronで環境変数を設定するために使用できるいくつかのアプローチがありますが、それらはすべてスクリプトでそれを設定することになります。

アプローチ1:

スクリプトで手動で必要な各変数を設定します。

アプローチ2:

プロフィールを入手する:

. $HOME/.bash_profile(または. $HOME/.profile

(通常、上記のファイルは他のファイルをソースとすることがわかります(例:~/.bashrc-> /etc/bashrc-> /etc/profile.d/*)-そうでない場合は、それらもソースとして使用できます。)

アプローチ3:

環境変数をファイルに保存します(目的のユーザーとして実行します)。

env > /path/to/my_env.sh

次に、cronスクリプトを使用してインポートします。

env - `cat /path/to/my_env.sh` /bin/sh

アプローチ4:

場合によっては、/etc/default/cronにグローバルcron変数を設定できます。ただし、すべてのcronジョブに設定されるため、これにはリスクの要素があります。

35
cyberx86

RedHat CentOSでは、/etc/rc.d/init.d/functionsデフォルトPATHを永続的に設定します。 /etc/rc.d/crondは、起動時に関数を呼び出します。

1
user215450

Cronは、実行時に指定された使用法でOWNシェルを作成します。

したがって、ユーザーの同じ変数を保持したい場合は、rootや他のユーザーではなく、自分のユーザーで実行してみてください。

または

最善の方法は、これらの変数を独自のスクリプトにエクスポートすることです。

1
Farhan

AWSでも同様の問題がありました。そのように考え出した

which python3

私にくれた /usr/bin/local/python3場所

その後

. $HOME/.profile; /usr/local/bin/python3 /home/ubuntu/your_script.py
0
Al Po