手柄2个的cron任务之间的“竞争条件”。 什么是最好的方法呢?(Handle “race-co

2019-10-18 11:52发布

我有一个定期运行一个cron任务。 这个任务取决于条件,有效,以完成其处理。 如果它的事项这一条件仅仅是一个SELECT在数据库中的特定记录。 如果条件不成立(即选择不返回预期的结果集),那么脚本会立即退出。
这是糟糕的状况将是有效的很快(不知道多久,但它是有效的,由于另一个脚本的运行)。
所以我想以某种方式使脚本更健壮。 我想到了2个解决方案:

  1. while循环, sleep不断,直到条件是有效的。 这应该工作,但它有缺点,一旦脚本是在循环,这是失控的。 所以,我虽然额外醒来后检查是一个特定的文件是否存在。 如果这样做,“理解”用户想要以“强制”停止它。
  2. 一旦脚本出这个条件尚未生效它附加在crontab中和停止的脚本。 这秒脚本不断为条件,如果该条件是有效的民意调查,然后重新启动的第一个脚本重新启动其处理。 该解决方案对我来说,似乎工作,但我不知道这是否是一个很好的解决方案。 例如,也许编程修改的crontab是一个坏主意?

无论如何,我想也许这个问题很常见,可以有一个标准溶液,比2,我想出了要好得多。 有没有人有一个更好的建议? 从我的想法是最好的? 我不是非常有后台任务经历了那么可能会有事情/问题,我可以监督。

Answer 1:

而不是编程方式追加crontab中,你可能要考虑使用at调度工作,在未来的一段时间内再次运行。 如果该脚本确定现在不能做的工作,它可以简单地安排自己再次运行几分钟(或几个小时,因为它可能)后来的方式at命令。



Answer 2:

从我们的意见的谈话之后,你就可以利用的条件执行在cron条目。 假设你要根据一天中的时间分支,您可以使用输出date

例如:这将总是调用第一命令,则调用第二命令只有在时钟小时目前11:

echo 'ScriptA running' ; [ $(date +%H) == 11 ] && echo 'ScriptB running'

更多的例子!

要检查第一个命令的返回值:

echo 'ScriptA' ; [ $? == 0 ] echo 'ScriptB'

若要改为检查标准输出,可以为冒号作为一个空操作,使用通过捕获输出与同和分支$()构建我们与使用date

: ; [ $(echo 'ScriptA') == 'ScriptA' ] && echo 'ScriptB'

在最后一个例子一个缺点:从所述第一命令STDOUT将不被打印到控制台。 你可以把它捕捉到你的变量echo出来,或者把它写入一个文件tee ,如果这是非常重要的。



文章来源: Handle “race-condition” between 2 cron tasks. What is the best approach?