前一次成功后如何停止cronjob

时间:2020-08-04 07:34:39

标签: shell cron sh

am编写了一个crontab脚本,该脚本将在每个星期六每15分钟运行一次。这个想法是要验证外部api状态是否= SUCCESS。如果成功,则当天的cronjob不再触发。 目前正在尝试递归,但是我不认为这是最好的解决方案。 还有其他解决方案可以实现这一目标吗?正在使用Shell脚本调用api。

这是现有的代码段:

  • Cronjob:

    */15 * * * 6 validate.sh 
    
  • 脚本:

    status='curl -X GET "api"' 
    if [[ $status == "SUCCEEDED" ]];then 
        trigger email
    else sleep 180 
        ./validate.sh     
    fi 
    

1 个答案:

答案 0 :(得分:1)

添加另一个cron作业,以便在另一个作业开始运行之前的星期五晚上删除标记文件:

59 23 * * 5 rm .succeeded.txt

然后更改脚本,以便该文件存在时中止运行,并在成功后创建它。

#!/bin/bash

test -e .succeeded.txt && exit
 
if [[ $(curl -X GET "api") == "SUCCEEDED" ]];then 
    trigger email
    touch .succeeded.txt
fi

我也尝试修复脚本中的其他错误,但是我不得不猜测很多事情。假设"SUCCEEDED"工作时curlGET的唯一输出。

将命令放入变量是无用的复杂性,它会使脚本更长,并且(非常轻微)变慢,但此外,当命令包含嵌入式引号时,它还会产生自己的问题;参见例如http://mywiki.wooledge.org/BashFAQ/050

...但是,当然,大概您想实际运行该命令。您的尝试仅是检查变量中的字符串是否等于"SUCEEDED",当然永远不会。

另一个问题是您产生了多个validate.sh作业,每个作业都会递归并重试。您需要一个,而不是两个都选。我坚持了您的日程安排,只是在每项工作中尝试一次。