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
答案 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"
工作时curl
是GET
的唯一输出。
将命令放入变量是无用的复杂性,它会使脚本更长,并且(非常轻微)变慢,但此外,当命令包含嵌入式引号时,它还会产生自己的问题;参见例如http://mywiki.wooledge.org/BashFAQ/050
...但是,当然,大概您想实际运行该命令。您的尝试仅是检查变量中的字符串是否等于"SUCEEDED"
,当然永远不会。
另一个问题是您产生了多个validate.sh
作业,每个作业都会递归并重试。您需要一个,而不是两个都选。我坚持了您的日程安排,只是在每项工作中尝试一次。