web-dev-qa-db-ja.com

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

awscliを使用してバックアップを行うためにcronjobを必要とするDockerコンテナーをセットアップしています。

CronジョブがDockerコンテナーの環境変数にアクセスできないという問題があります。起動時に回避しながら、すべての環境変数をファイルに出力しますprintenv > /env

Cronジョブからsourceを使用しようとすると(crontabとcrontabによって呼び出されるスクリプトの両方で直接試しました)、機能していないようです。

私はプロジェクトの簡略版を作成して、問題を実証しました(ロギング用のrsyslogを含む)

Dockerfile:

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/*

crontab:

# 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は私の変数を使用して作成されましたが、ソースが取得されることはありません。

4

まず、コマンドの(まあ、Shellビルトインの)名前はsourceです。 sourceというスクリプトを作成して/に配置しない限り、/sourceではなくsourceが必要です。

次の問題は、通常cron/bin/shとして持っているものをすべて使用し、sourceがバシズム(または他のより複雑なシェル)であることです。ポータブルな 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

また、&&&に変更しました。バックグラウンドでのソーシングは、私が見る限りでは無意味だからです。

4
terdon