我有一个定期运行一个cron任务。 这个任务取决于条件,有效,以完成其处理。 如果它的事项这一条件仅仅是一个SELECT在数据库中的特定记录。 如果条件不成立(即选择不返回预期的结果集),那么脚本会立即退出。
这是糟糕的状况将是有效的很快(不知道多久,但它是有效的,由于另一个脚本的运行)。
所以我想以某种方式使脚本更健壮。 我想到了2个解决方案:
- 放
while
循环, sleep
不断,直到条件是有效的。 这应该工作,但它有缺点,一旦脚本是在循环,这是失控的。 所以,我虽然额外醒来后检查是一个特定的文件是否存在。 如果这样做,“理解”用户想要以“强制”停止它。 - 一旦脚本出这个条件尚未生效它附加在crontab中和停止的脚本。 这秒脚本不断为条件,如果该条件是有效的民意调查,然后重新启动的第一个脚本重新启动其处理。 该解决方案对我来说,似乎工作,但我不知道这是否是一个很好的解决方案。 例如,也许编程修改的crontab是一个坏主意?
无论如何,我想也许这个问题很常见,可以有一个标准溶液,比2,我想出了要好得多。 有没有人有一个更好的建议? 从我的想法是最好的? 我不是非常有后台任务经历了那么可能会有事情/问题,我可以监督。
而不是编程方式追加crontab中,你可能要考虑使用at
调度工作,在未来的一段时间内再次运行。 如果该脚本确定现在不能做的工作,它可以简单地安排自己再次运行几分钟(或几个小时,因为它可能)后来的方式at
命令。
从我们的意见的谈话之后,你就可以利用的条件执行在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?