我有一个定期运行的cron任务。此任务取决于有效的条件以完成其处理。如果重要,这个条件只是数据库中特定记录的SELECT。如果条件不满足(即SELECT没有返回预期的结果集),则脚本立即退出
这很糟糕,因为条件很快就会有效(不知道多久会因为另一个脚本的运行而有效)。
所以我想以某种方式使脚本更健壮。我想到了两个解决方案:
while
循环和sleep
,直到条件为止
有效。这应该工作,但它有一个脚本的缺点
在循环中,它失去控制。所以我要另外
醒来后检查是否存在特定文件。如果是的话
“理解”用户想要“强行”阻止它。 无论如何,我认为也许这个问题很常见,可能有一个标准的解决方案,比我提出的2要好得多。有人有更好的建议吗?哪个来自我的想法最好?我对cron任务不是很有经验,所以我可以监督的事情/问题。
答案 0 :(得分:1)
而不是以编程方式附加crontab,您可能需要考虑使用at
来安排作业在将来的某个时间再次运行。如果脚本确定它现在无法完成其工作,它可以通过at
命令安排自己再次运行几分钟(或几小时,可能)。
答案 1 :(得分:1)
在评论中跟进我们的对话,您可以在cron条目中利用conditional execution。假设您想要根据时间进行分支,可以使用date
的输出。
例如:这将始终调用第一个命令,然后仅在时钟小时为11时才调用第二个命令:
echo 'ScriptA running' ; [ $(date +%H) == 11 ] && echo 'ScriptB running'
更多例子!
要检查第一个命令的返回值:
echo 'ScriptA' ; [ $? == 0 ] echo 'ScriptB'
要改为检查STDOUT,您可以use as colon as a noop并使用我们与$()
使用的date
构造捕获输出进行分支:
: ; [ $(echo 'ScriptA') == 'ScriptA' ] && echo 'ScriptB'
最后一个示例的一个缺点:来自第一个命令的STDOUT将不会打印到控制台。您可以将其捕获到echo
输出的变量,或者将其写入tee
的文件,如果这很重要的话。