cronで「ソース」を使用できませんか?

cronで「ソース」を使用できませんか?

を使用するには、cronjobが必要なDockerコンテナを設定していますawscli

cronジョブがdockerコンテナの環境変数にアクセスできないという問題があります。起動操作を実行するときは、すべての環境変数をファイルに印刷しますprintenv > /env

cronジョブで使用しようとするとsource(crontabで直接試して、crontabで呼び出すスクリプトで試しましたが)動作しないようです。

問題を示すために、プロジェクトの単純化されたバージョンを作成しました。(rsyslogロギングに含まれる):

ドッカーファイル:

FROM debian:jessie

# Install aws and cron
RUN apt-get -yqq update
RUN apt-get install -yqq awscli cron rsyslog

# Create cron job
ADD crontab /etc/cron.d/hello-cron
RUN chmod 0644 /etc/cron.d/hello-cron

# Output environment variables to file
# Then start cron and watch log
CMD printenv > /env && cron && service rsyslog start && tail -F /var/log/*

予約されたもの:

# Every 3 minutes try to source /env and run `aws s3 ls`.
*/3 * * * * root /usr/bin/env bash & source /env & aws s3 ls >> /test 2>&1

コンテナを起動すると、/env変数が作成されましたがインポートできないことがわかります。

答え1

まず、コマンド(まあ、シェル組み込み)の名前はですsource。というスクリプトを書いて、代わりに好きな場所にsource入れない限り。/source/source

次の問題はcron、一般的に持っているものを使用することです。/bin/shそれはsourcebashism(または他のより複雑なシェル)です。持ち運べる、POSIX 互換コマンドソースファイルは.次のとおりですsource

*/3 * * * * root /usr/bin/env bash & . /env & aws s3 ls >> /test 2>&1

さらに、私はそれが何をすべきかをよく理解していません。 Bashセッションを開始し、それをバックグラウンドで送信するためのポイントは何ですか? bashを使用して後続のコマンドを実行するには、次のものが必要です。

*/3 * * * * root /usr/bin/env bash -c '. /env && aws s3 ls' >> /test 2>&1

また、私が知っている限り、バックグラウンドで購入を行うことは意味がないので、に変更しました&&&

答え2

.次のように使用できます。テドンの答え/bin/shデフォルトではcronが使用され、時には命令を認識しないことがあると言われていますsource

もう一つ追加したいです。ファイルをインポートして2番目のコマンドで使用できないため、次の操作が機能しない可能性があります。

* * * * * source ~/.bash_profile
* * * * * do some stuff with bash_variables

各行はセッション自体なので、最初のコマンドのソース変数は後続のコマンドでは使用できません。あなたはこれをしなければなりません:

* * * * * source ~/.bash_variable && do some stuff with bash_variables

関連情報