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


20

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

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

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


8
Cronは常にほとんど空の環境で実行されます。HOME、LOGNAME、およびSHELLが設定されています。と非常に限られたパス。すべての変数を自分で設定したくない場合はsource、(bash)プロファイルを使用できる場合があります。
cyberx86

2
@ cyberx86:答えとしてそれを書き上げてrepを取得してみませんか?
user9517はGoFundMonicaを

2
@Iain:担当者はいつでも歓迎しますが、1行の回答では実際に担当者を獲得できないと感じることがあります。私は簡潔な答えがその場所を持っていることを完全に受け入れますが、私はいくつかの支援を提供したいときにコメントを「簡単な方法」として使用していましたが、完全な詳細な説明を書きませんでした(午前1時でした。 ..)。しかし、私はあなたのアドバイスを受け取り、これについて少し拡張し、答えとして追加します。
cyberx86

@ cyberx86:正しくない、または何もないよりも、正しいライナーを1つ用意する方が良いでしょう。
user9517はGoFundMonicaを

回答:


31

Cronは常にほとんど空の環境で実行されます。HOME、LOGNAME、およびSHELLが設定されています。と非常に限られたパス。したがって、実行可能ファイルへの完全なパスを使用し、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:

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


アプローチ2は、パスワードやAPIキーなど、env varのディスクにヒットしてはならない機密性の高いものがあるサーバーに最適です。
AP

アプローチ4は、Dockerエンジンがenv変数を設定するdocker環境で機能しました。これが機能するためには、Dockerエントリポイントにenvを保存する必要がありました。完全なソリューションはこちら:github.com/rayyanqcri/swarm-scheduler
hammady

アプローチ3について詳しく説明してください。インポートしようとすると、次のようになりますbash: SHELL=/bin/bash: No such file
KuboMD

1

Cronは、実行に使用される指定された用途で、自身のOWNシェルを作成します。

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

または

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


1

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


0

AWSで同様の問題が発生しました。そのように考え出した

which python3

/usr/bin/local/python3場所をくれた

その後

. $HOME/.profile; /usr/local/bin/python3 /home/ubuntu/your_script.py
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.