次の crontab コマンドを使用して、コード ベースを毎日更新しようとしました。しかし、テストしたところ、最初の手順自体が機能しませんでした。
27 15 * * * . cd /home/covuser/user/ && . /home/covuser/user/conf.sh
40 17 * * * . cd /home/covuser/user && . /home/covuser/user/checkout.sh
conf.sh には、コードをチェックアウトするために必要な環境変数が含まれています。checkout.sh ファイルはチェックアウト プロセスを実行します。
最初の行は必要な環境変数を設定するはずです。しかし、それは行われません。
これにどんな間違いを犯したのでしょうか? よろしくお願いします。
答え1
crontab の各行は個別のジョブを表し、個別にスケジュールされ実行されます。
つまり、特にあなたの場合、それらは異なるシェル セッションで実行されるため、1 つのジョブでいくつかの環境変数を設定するためにスクリプト ファイルをソース化しても、後で実行される別のジョブの環境には影響しません。
プロセスを変更して、両方のスクリプトを同じシェル セッション内で実行する必要があります。そのため、最も簡単には同じ cron ジョブ内で実行できます。
実行間に遅延が必要な場合は、たとえば、sleep
後の時間を固定した別のジョブをスケジュールする代わりに、次のようにすることでそれを実現できます。
ああ、もちろん、他のコメントや回答で指摘されているように、スクリプトを.
サブシェルではなく現在のシェル環境で実行させるには、 のみを使用できます。ただし、cd
はスクリプトではなく組み込みのシェル コマンドであり、常に現在のシェル環境で実行されるため、 と記述すること. cd somehwere
もエラーになります。
答え2
問題は.
前述の にあると思いますcd
。
.
(エイリアス fro source
) を使用すると、ファイルをソースできます。これは、 などのシェル組み込みコマンドでは機能しません。cd
これらは、ソースできる実行可能ファイルではないためです。
2 つのコマンドを AND - で連結すると&&
、シェルは失敗したコマンドの後のコマンドをスキップします。これは、結果の値 ( ) が変更されないためです。別の動作が必要な場合は、を にfalse && true == false
置き換えることができます。&&
;
これは動作するはずです:
27 15 * * * cd /home/covuser/user/ && . /home/covuser/user/conf.sh
40 17 * * * cd /home/covuser/user && . /home/covuser/user/checkout.sh
アップデート: スクリプトが依存している場合 (そうだと思いますが)、すべてを 1 つのセッションで実行します。 (各 cron エントリを実行するために新しい bash セッションが開かれます)
27 15 * * * cd /home/covuser/user/ && . /home/covuser/user/conf.sh && . /home/covuser/user/checkout.sh