1

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

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

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

4

2 回答 2

1

跟进我们在评论中的对话,您可以利用 cron 条目中的条件执行。假设您想根据一天中的时间进行分支,您可以使用来自date.

例如:这将始终调用第一个命令,然后仅当时钟小时当前为 11 时才调用第二个命令:

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

更多例子!

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

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

要改为检查 STDOUT,您可以使用冒号作为 noop$()和分支,方法是使用我们使用的相同构造捕获输出date

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

最后一个示例的一个缺点:第一个命令的 STDOUT 不会打印到控制台。如果这很重要,您可以将其捕获到您输出的变量中echo,或者将其写入带有 的文件tee

于 2013-08-13T17:40:08.723 回答
1

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

于 2013-08-08T19:25:12.843 回答