web-dev-qa-db-ja.com

cronはスクリプトを次々に実行します

最初のスクリプトが終了した場合にのみ次々に追加したい3つのスクリプト(A、B、C)があります。現時点では、A.shが終了するとB.shに進みますが、B.shが失敗すると、C.shは実行されません。それを修正する方法についてのアイデアはありませんか?私はcronのようにそれらを実行しています:

30 6,14 * * 1-5/home/user/scripts/A.sh ; /home/user/scripts/B.sh ; /home/user/scripts/C.sh ; 

アイデアはありますか?

3
john

次のように、組織化された方法で他のスクリプトを呼び出すスクリプトを作成できます。これはcronファイルです。

30 6,14 * * 1-5/home/user/scripts/A-B-C.sh

次に、スクリプトA-B-C.shは次のように定義されます。

#!/bin/bash
# Run script A,B,C

# execute script A
./home/user/scripts/A.sh

#execute script B
./home/user/scripts/B.sh

enter code here
#execute script C
./home/user/scripts/C.sh

\にしたくないスクリプトB.shおよびC.shにスクリプトA.shにエラーがある場合に実行する場合、変数を使用してエラー追跡を含めることができます。 、その値を0または1として保持できます。次に、前のスクリプトが期待どおりに終了しない場合、次のスクリプトをどうするかについて必要な決定を下すことができます。例は次のとおりです。

#!/bin/bash
# Run script A,B,C

# Exit code and default run code initialization
exit_A=0
exit_B=0

def_B=1
def_C=1
#----------------------------------------------


# execute script A
. ./home/user/scripts/A.sh $exit_A #make sure to change the value of exit_A to 1 if A finishes as expected.

if [$exit_A==1] && [def_B==1] #only if A finishes without error and B is ok
then
#execute script B
. ./home/user/scripts/B.sh $exit_B
else
<do something like log>
fi

if [$exit_B==1] && [def_C==1] #only if B finishes without error and C is ok
then
#execute script C
. ./home/user/scripts/C.sh $exit_C
else
<do something like log>
fi

now="$(date +'%d/%m/%Y-%T')"
#make a log in a file (print can be used for better formatting)
echo -e $now,$exit_A,$exit_B,$exit_C >>  /home/user/log/script_log.txt 

上記のスクリプトでは、変数がスクリプト間で渡されています。コードを使用する前に注意してテストしてください。

3
ankit7540

Cronジョブを作成するよりエレガントな方法は次のとおりです。

30 6,14 * * 1-5 /home/user/scripts/A.sh && /home/user/scripts/B.sh && /home/user/scripts/C.sh

これにより、3つのジョブが連続して実行されます。変数を適切に設定していれば、$HOME/scripts/A.shを実行できます。

基本的なジョブ制御の場合、たとえばscript-1が成功した場合にのみscript-2が実行されるようにするには、exit = 0の行を追加して、/ tmp/script-1_successなどの一時ファイルを書き込みます。

次に、script-2の先頭で、/ tmp/script-1_successが存在するかどうかを確認します。そうでない場合は、終了します。

3
jones0610