如何在上一次成功后停止 cronjob
how to stop the cronjob after the previous success
我正在编写一个 crontab 脚本,该脚本将在每个星期六每 15 分钟 运行。这个想法是验证外部 api 状态 =SUCCESS 与否。如果成功,则当天的 cronjob 不应再触发。
现在正在尝试递归,但我认为这不是最佳解决方案。
有没有其他解决方案来实现这一目标?我正在使用 Shell 脚本调用 api.
这是现有的片段:
定时任务:
*/15 * * * 6 validate.sh
脚本:
status='curl -X GET "api"'
if [[ $status == "SUCCEEDED" ]];then
trigger email
else sleep 180
./validate.sh
fi
添加另一个 cron
作业,以便它在星期五晚上,在另一个作业开始之前删除标志文件 运行ning:
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
作业,每个作业都会递归并重试。你想要其中之一,而不是两者。我按照你的时间表去做,每份工作只试一次。
我正在编写一个 crontab 脚本,该脚本将在每个星期六每 15 分钟 运行。这个想法是验证外部 api 状态 =SUCCESS 与否。如果成功,则当天的 cronjob 不应再触发。 现在正在尝试递归,但我认为这不是最佳解决方案。 有没有其他解决方案来实现这一目标?我正在使用 Shell 脚本调用 api.
这是现有的片段:
定时任务:
*/15 * * * 6 validate.sh
脚本:
status='curl -X GET "api"' if [[ $status == "SUCCEEDED" ]];then trigger email else sleep 180 ./validate.sh fi
添加另一个 cron
作业,以便它在星期五晚上,在另一个作业开始之前删除标志文件 运行ning:
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
作业,每个作业都会递归并重试。你想要其中之一,而不是两者。我按照你的时间表去做,每份工作只试一次。