別のディレクトリの Crontab スクリプトが機能しない

別のディレクトリの Crontab スクリプトが機能しない

次の 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

関連情報