Concurrency 如果当前作业未完成,Cron是否会启动新作业?

Concurrency 如果当前作业未完成,Cron是否会启动新作业?,concurrency,cron,Concurrency,Cron,可能重复: 我有一个cron作业,可能需要2分钟或5小时才能完成。 我需要确保这项工作始终得到执行 我的问题是: 如果我设置为每分钟执行一次,它会在上一次操作完成后启动还是同时运行并弄乱数据库?它们会同时运行。我建议将其记录在数据库中。我会记录脚本何时启动以及任务是否成功完成。 脚本还应该更新db中的记录-大约每5分钟更新一次-我仍在运行 当新作业启动时,它应该检查是否所有以前的任务都已完成或上次更新已超过分钟(?)之前,如果是,则运行,否,然后退出 通过这种方式,您可以知道上一个脚本正在运行

可能重复:

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

我的问题是:


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

它们会同时运行。

我建议将其记录在数据库中。我会记录脚本何时启动以及任务是否成功完成。 脚本还应该更新db中的记录-大约每5分钟更新一次-我仍在运行

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

通过这种方式,您可以知道上一个脚本正在运行,或者如果它已死亡,则尚未完成且10分钟内未更新的作业将被标记为已完成


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

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

与Zdenek的方法相比,这种方法的优点是它不需要数据库,并且当过程结束时,集群会自动释放。这包括进程终止、服务器重新启动等情况

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


需要5小时才能执行的cron作业?请确保在标题中提出有意义的问题。请使用flock(),而不是这个。在这里,您正在重新发明轮子,并且您有一种模糊性,即使用时间窗口来判断脚本是否仍然有效(如果您选择这种方法,则应将其设置为比cron运行之间的间隔更长)。这在大多数现代操作系统和大多数现代语言上都是标准的,并且比依赖非活动超时更健壮。正如OP提到的cron,它们可能在linux上,linux肯定内置了flock()。Perl、PHP、Python等都很好,数据库是比使用标准操作系统功能更重的“附加软件”。我会选择这个答案。请看这里: