将 cron 任务排队最多 10 次

将 cron 任务排队最多 10 次

这有点涉及到我发表的另一篇文章,但有所不同,所以我将其作为一个新问题发布。

我有一个运行的脚本,可能需要 1 分钟多一点的时间来处理,并且我的 cron 设置为每分钟运行一次。如果第一个 cron 作业尚未完成,我可以使用文件中的 flock (php) 来停止另一个执行该脚本的 cron 作业,但是,这意味着我将丢失例程的一次迭代,并且必须等待近一分钟才能再次触发它(我的理解让我相信)。

我希望如果脚本被锁定,不要中断,而是等待。但是,随着时间的推移,这个数字可能会变得很高,所以我还希望将排队的 cron 数量限制为 10。

我是 Linux 的真正新手(现在已经使用 Linux VPS 3 天了),所以我不确定我的解决方案是否实用。

谢谢。

答案1

我想说的是,每个作业都可以创建一个锁定文件并等待最新的现有锁定文件。如果锁定文件的数量为 10,则退出,而不是创建并等待。

答案2

为什么一次运行失败会造成影响?在这一点上,我认为您需要超越 cron 作业和脚本。

您在这里遇到了一个编程问题。您可以让脚本每次运行(如果它决定等待)时读取文本文件中的计数器,然后在等待时增加它,然后在最终运行时减少它。如果计数器读数超过 10,那么您可以退出。但现在您必须确保没有任何东西试图同时读取或写入计数器。

此时,为什么不将其编写为守护进程,以便它实际上可以跟踪自己的状态?您甚至可能希望将其编写为服务器和客户端。

答案3

正如其他人指出的那样,cron 在这里不是合适的工具。

使用锁文件时需要注意的事项:* 您必须确保在退出或服务器重启时清理它们。如果进程被终止并且锁文件被留下,您可能会遇到永远无法运行的情况,因为有 10 个过时的锁文件。* 要么使用专门用于锁文件的程序,要么使用目录。如果目录存在,mkdir 将出错,touch 将始终返回成功,并且您会打开竞争条件。

答案4

我会在这里跳过 cron。只需监控所有文件并在需要时在它们未被锁定时使用它们。这可能吗?

相关内容