
を使用するには、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
それはsource
bashism(または他のより複雑なシェル)です。持ち運べる、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