29

可能重复:
如何防止 cron 作业执行,如果它已经在运行

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

我的问题是:

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

4

3 回答 3

57

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

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

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

于 2013-01-19T00:37:22.370 回答
15

它们将同时运行。

于 2013-01-19T00:09:26.823 回答
4

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

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

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

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

于 2013-01-19T00:13:08.520 回答