Cron 作业访问同一静态文件

Cron 作业访问同一静态文件

我正在尝试设置两个单独的 cron 作业来访问同一个静态文件。其中一个作业每分钟运行一次,汇总到达文件的新数据。第二个作业每 30 分钟运行一次,解析汇总数据并截断文件以在接下来的 30 分钟内重置它。

显然,这里每 30 分钟可能会出现一次死锁。有没有办法编写第一个任务的 cron 作业,使其每分钟仅执行 29 分钟(无需列出 1-60 分钟内的每一分钟,不包括 30 和 60),然后在第 31 分钟再次启动?谢谢!

编辑

根据要求,我使用 PHP 来执行这些操作(因为其中涉及大量数据结构)。我已经实现了 PHPflock函数的使用,而函数的文档指定调用阻塞直到1)获得锁,或2)LOCK_NB指定选项,我对以下示例似乎暗示即使使用阻塞调用也可能无法获得锁这一事实感到困惑。

除非这是由于其他问题(权限、操作系统中断等)造成的?在获得锁定之前一直阻塞的问题才是我提出这个问题的真正动机,看看是否有其他方法可以完全避免锁定文件,从而减轻非阻塞锁定尝试失败和脚本停止的风险。

答案1

您不想这样做;一旦您的工作耗时超过一分钟,您就会陷入困境。这样的竞争条件会导致严重的问题:间歇性、不可预测且难以诊断。

Pboin 完全正确:你需要探索使用信号在您的代码中,问题就会消失,您根本不必担心时间表冲突。

你使用什么语言?

编辑(抱歉,php 已经有一段时间没用过了,而且有点醉了,所以可能无法编译):

锁定的“常用”策略是检查是否有锁(在本例中,我尝试获取一个锁),如果有锁,则执行短暂等待并重试。您可以尝试在 while 循环中使用 php 的 sleep() 函数,例如:

while($x){
    if(flock($file_handle, LOCK_EX)){
        $x = false;
    }else{
        sleep(5);
        $x = true;
    }
}

我使用类似的东西来完成大量基于 cron 的写入任务。效果非常好。它实际上是一种类似于 ALOHA 通信协议的方法,与后来称为“TCP/IP”的网络协议非常相似。尝试、尝试、再尝试。

答案2

好吧,您可以按照您的建议在 cron 中列出您的分钟数,但这并不能真正解决问题。(首先,cron 不能保证在任何给定的分钟内执行。)

您可能最好在脚本中实现一些锁定功能 —— 这不太容易被破解。高级 Bash 脚本指南,一个优秀且免费的资源建议该lockfile命令,它将帮助您做到这一点。

只要正确地做这件事,你就不用那么担心了。

相关内容