Crontabジョブを実行しました0 2 */1 * * /aScript >aLog.log 2>&1
を「root」ユーザーとして使用しましたが、envが「root」ユーザーのenvとは異なるため、スクリプトの実行時の動作が異なります。
修正の試みは、rc.dファイルにエクスポートコマンドを配置することでしたが、それでも表示されませんでした! aScript自体にエクスポートコマンドを配置します。
私の質問は、この問題に取り組むより良い方法があるということですか?そして、同じユーザー「root」からのものであるにもかかわらず、envが欠落しているのはなぜですか? (ルートから「crontab -e」を実行してcrontabを変更します)
Cronは常にほとんど空の環境で実行されます。 HOME
、LOGNAME
、および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
ジョブに設定されるため、これにはリスクの要素があります。
RedHat CentOSでは、/etc/rc.d/init.d/functions
デフォルトPATH
を永続的に設定します。 /etc/rc.d/crond
は、起動時に関数を呼び出します。
Cronは、実行時に指定された使用法でOWNシェルを作成します。
したがって、ユーザーの同じ変数を保持したい場合は、rootや他のユーザーではなく、自分のユーザーで実行してみてください。
または
最善の方法は、これらの変数を独自のスクリプトにエクスポートすることです。
AWSでも同様の問題がありました。そのように考え出した
which python3
私にくれた /usr/bin/local/python3
場所
その後
. $HOME/.profile; /usr/local/bin/python3 /home/ubuntu/your_script.py