处理2个cron任务之间的“竞争条件”。什么是最好的方法?

时间:2013-08-08 17:20:34

标签: linux perl synchronization cron crontab

我有一个定期运行的cron任务。此任务取决于有效的条件以完成其处理。如果重要,这个条件只是数据库中特定记录的SELECT。如果条件不满足(即SELECT没有返回预期的结果集),则脚本立即退出 这很糟糕,因为条件很快就会有效(不知道多久会因为另一个脚本的运行而有效)。
所以我想以某种方式使脚本更健壮。我想到了两个解决方案:

  1. 不断放置while循环和sleep,直到条件为止 有效。这应该工作,但它有一个脚本的缺点 在循环中,它失去控制。所以我要另外 醒来后检查是否存在特定文件。如果是的话 “理解”用户想要“强行”阻止它。
  2. 一旦脚本发现条件无效尚未它 在crontab中附加一个脚本并停止。那个秒脚本 持续轮询该条件以及条件是否有效 然后重新启动第一个脚本以重新启动其处理。这个解决方案似乎有用,但我不确定它是否是一个很好的解决方案。例如。也许以编程方式修改crontab是一个坏主意?
  3. 无论如何,我认为也许这个问题很常见,可能有一个标准的解决方案,比我提出的2要好得多。有人有更好的建议吗?哪个来自我的想法最好?我对cron任务不是很有经验,所以我可以监督的事情/问题。

2 个答案:

答案 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的文件,如果这很重要的话。