我确实有 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 ;
请问有什么想法吗?
答案1
创建该 cron 作业的更优雅的方法是:
30 6,14 * * 1-5 /home/user/scripts/A.sh && /home/user/scripts/B.sh && /home/user/scripts/C.sh
这将导致三个作业连续运行。$HOME/scripts/A.sh
如果您已相应地设置变量,则可以这样做。
对于基本作业控制,例如确保仅当脚本 1 成功时脚本 2 才运行,您可以为 exit=0 添加一行以写入临时文件(如 /tmp/script-1_success)。
然后在 script-2 的开头,让它检查 /tmp/script-1_success 是否存在。如果不存在,则退出。
答案2
您可以创建一个以有组织的方式调用其他脚本的脚本,如下所示,这是您的cron
文件,
30 6,14 * * 1-5/home/user/scripts/ABC.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
在上面的脚本中,变量正在跨脚本传递。请谨慎使用并在使用代码前进行测试。