【问题标题】:Will Cron start a new job if the current job is not complete? [duplicate]如果当前工作未完成,Cron 会开始新工作吗? [复制]
【发布时间】:2013-01-02 19:07:08
【问题描述】:

可能重复:
How to prevent the cron job execution, if it is already running

我有一个cron 的工作,可能需要 2 分钟或 5 小时才能完成。 我需要确保始终执行此作业。

我的问题是:

如果我将它设置为每分钟执行一次,它会在前一个完成后启动,还是它们会同时运行并弄乱数据库?

【问题讨论】:

  • 一个需要 5 小时才能执行的 cron 作业?
  • 请确保在标题中提出有意义的问题。

标签: concurrency cron


【解决方案1】:

我建议将其记录在数据库中。我会记录脚本何时开始以及任务是否成功完成。 该脚本还应该更新数据库中的记录——比如每 5 分钟一次——我仍在运行。

当新作业开始时,它应该检查所有以前的任务是否已完成或上次更新是否超过几分钟(?),如果是则运行,否则退出。

这样您就知道之前的脚本正在运行,或者如果它死了,则未完成且 10 分钟未更新的作业将被标记为已完成。

我应该提到,当您有多个服务器并且可以在其中任何一个上触发任务时,此解决方案可能比群发更好。

【讨论】:

  • 使用flock(),而不是这个。您在这里重新发明了轮子,并且您在使用时间窗口来判断脚本是否仍然存在时存在歧义(如果您确实选择了这种方法,则应该将其设置为比 cron 运行之间的间隔更长。)
  • File locking 是大多数现代操作系统和大多数现代语言的标准配置,并且比依赖不活动超时更强大。正如 OP 提到的 cron,它们很可能在 linux 上,它肯定内置了 flock()。Perl、PHP、Python 等都可以。
  • 与使用标准操作系统功能相比,数据库是一个重得多的“附加软件”。 . .
【解决方案2】:

它们将同时运行。围绕这个的标准做法是创建一个文件锁(通常称为flock),如果锁不可用,则不要运行。

与 Zdenek 的方法相比,它的优势在于它不需要数据库,并且当流程结束时,会自动释放群。这包括进程被杀死、服务器重启等情况。

虽然您没有提及您的 cron 作业是用什么编写的,但在大多数语言中,flock 是标准的。我建议使用谷歌搜索锁和您正在使用的语言,因为这将是更强大的解决方案,而不是依赖于随机超时。以下是来自 SO 的一些示例:

【讨论】:

【解决方案3】:

它们将同时运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多