web-dev-qa-db-ja.com

crontab環境

Javaサーバーアプリケーションを起動するためのさまざまなスクリプトを作成しました。これらのアプリケーションは通常、シャットダウンされる前に24時間実行されます(同じスクリプトを異なるパラメーターで呼び出すことにより)。

このスクリプトは、ファイルで定義されている環境変数_~/<user>.env_に依存しています。これは、_.bashrc_から取得しています。

これは、コマンドラインからスクリプトを呼び出すときに問題なく機能しますが、スクリプトをcrontabエントリとして追加する場合は、_.bashrc_が読み取られないという問題が発生します。

私の質問:この問題を解決するためのベストプラクティスのアプローチは何ですか?次のようなcrontabエントリを定義できることに気付きました。

_* * * * 1-5 /usr/bin/bash -c '. /home/myuser/myuser.env && /home/myuser/scripts/myscript.sh'
_

...しかし、これは明らかに醜いようです。あるいは、すべてのスクリプトの最初に_myuser.env_を調達することもできますが、これは維持するのが悪夢になります。

助けていただければ幸いです。

7
Adamski

私は実際にbashコマンドに '-l'(--login)フラグを追加することでかなりエレガントなソリューションを発見しました。これにより、.bashrcを含むすべてのログインファイルが読み込まれます。したがって、私のcrontabコマンドは単純です。

* * * * 1-5 /usr/bin/bash -lc '/mnt/group/core/deploy/scripts/test.sh' > /dev/null 2>&1
10
Adamski

私は通常、短いcronラッパースクリプトでこれに対処します。

#!/bin/bash
[ -r $HOME/.bashrc ] && . $HOME/.bashrc
[ -r $HOME/.profile ] && . $HOME/.profile
exec "$@"

次に、crontabのコマンドの前にラッパーを付けます。

* * * * 1-5 ~/scripts/cron-wrapper ~/scripts/myscript.sh
* * * * 1-5 ~/scripts/cron-wrapper ~/scripts/myotherscript.sh

cronの一部のバージョン を使用すると、crontabで変数を直接設定できます。残念ながら、私は仕事でそれらを使用することができません。

11
pra

別の(必ずしも良いとは限りませんが)オプションは、これらをrootのcrontabに追加し、エントリにダッシュ付きのsuを使用して、問題のユーザーになることです。環境変数は、〜/ .bashrcなどのユーザーのデフォルトのシェル環境を介して自動的に取り込まれます。例えば:

* * * * 1-5 su - scriptuser '/home/myuser/scripts/myscript.sh'これにより、適切なログインのすべての環境変数を使用して、scriptuserとしてジョブが実行されます。欠点は、スクリプトユーザー自身がこのジョブを設定できなかったことです。そのためにはroot権限が必要です。

3

cron-wrapperソリューションは、1つの変更で機能しました。$ HOMEをユーザーのホームフォルダーへの絶対パスに置き換える必要がありました。この場合は、次のようになりました。

#!/bin/bash
[ -r /root/.bashrc ] && . /root/.bashrc
[ -r /root/.profile ] && . /root/.profile
exec "$@"
1
Datageek

私が考えることができる他の唯一のことは以下に基づいているでしょう:

bash -i --rcfile 'init' -c 'script'

これはおそらくあまり魅力的ではありません。

最近のバージョンのcronでは、ジョブを実行する前に任意の環境変数を設定できます。したがって、これをcrontabに追加できます。

CRON = 1

次に、.bash_loginで次のようにします。

[-n "$ CRON"] &&。 .bashrc

0
digdug