【问题标题】:Handle "race-condition" between 2 cron tasks. What is the best approach?处理 2 个 cron 任务之间的“竞争条件”。最好的方法是什么?
【发布时间】:2013-08-10 12:39:02
【问题描述】:

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

  1. 不断地放一个while循环和sleep直到条件满足 有效的。这应该可行,但它的缺点是一旦脚本 在循环中,它是失控的。所以我想另外 醒来后检查是否存在特定文件。如果它做到了 “理解”用户想要“强制”停止它。
  2. 一旦脚本发现条件无效 在 crontab 中附加一个脚本并停止。那一秒脚本 不断轮询条件以及条件是否有效 然后重新启动第一个脚本以重新开始其处理。这个解决方案对我来说似乎有效,但我不确定它是否是一个好的解决方案。例如。也许以编程方式修改 crontab 是个坏主意?

无论如何,我认为也许这个问题很常见,并且可以有一个标准的解决方案,比我想出的 2 好得多。有人有更好的提议吗?我的想法中哪个最好?我对 cron 任务不是很有经验,所以我可能会监督一些事情/问题。

【问题讨论】:

  • 如果一个工作依赖另一个工作,你能按顺序运行它们吗? stackoverflow.com/questions/9639434/…
  • @rutter: 否,因为另一个作业被设计为以小间隔不断运行,并以小“批次”(以天为单位运行)处理真正的大数据,因此安排了第二个 cron 任务大约在任务结束时,但有时任务还没有完全完成。此外,安排第二个任务是没有意义的,例如10 小时后,因为 1)同步问题在一个小间隔内 2)第二个脚本的处理也需要一段时间,所以仅仅在几个小时后重新安排它会破坏我们期望完全关闭的过程结果
  • 所以大多数时候,你运行ScriptA,但有时你想运行ScriptA && ScriptB?您可以在 cron 条目中使用条件逻辑(可能按一天中的时间或运行次数),或者 ScriptA 可以包含一些在适当时启动 ScriptB 的逻辑,或者您的 cron 条目可以调用 ScriptC 来根据需要运行其中一个/两个命令。我赞成这类解决方案。如果您设置了 sleep-until-ready 机制(这应该可以工作!),我提出的唯一建议是限制 ScriptB 将等待的睡眠周期数。
  • @rutter:要是我知道怎么做你建议的这些事情就好了……尤其是 crontab 中的条件逻辑
  • 明白了。我会将其作为答案发布(格式要好得多)。

标签: linux perl synchronization cron crontab


【解决方案1】:

您可能需要考虑使用at 来安排作业在未来某个时间再次运行,而不是以编程方式附加 crontab。如果脚本确定它现在无法完成它的工作,它可以简单地通过at 命令安排自己在几分钟(或几个小时,可能)后再次运行。

【讨论】:

    【解决方案2】:

    根据我们在 cmets 中的对话,您可以在 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 的文件,如果这很重要的话。

    【讨论】:

    • +1。但我的情况将是其中一个脚本的结果
    • 我添加了一些可能很方便的示例。
    猜你喜欢
    • 2018-04-05
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    相关资源
    最近更新 更多