【发布时间】:2013-08-10 12:39:02
【问题描述】:
我有一个定期运行的 cron 任务。该任务依赖于一个有效的条件才能完成其处理。万一这很重要,这个条件只是数据库中特定记录的 SELECT 。如果不满足条件(即 SELECT 未返回预期的结果集),则脚本立即退出。
这很糟糕,因为条件很快就会生效(不知道多久,但由于另一个脚本的运行,它将生效)。
所以我想以某种方式使脚本更健壮。我想到了2个解决方案:
- 不断地放一个
while循环和sleep直到条件满足 有效的。这应该可行,但它的缺点是一旦脚本 在循环中,它是失控的。所以我想另外 醒来后检查是否存在特定文件。如果它做到了 “理解”用户想要“强制”停止它。 - 一旦脚本发现条件无效还 在 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