Cron作业访问相同的静态文件

我试图设置两个独立的cron作业访问相同的静态文件。 其中一个作业每分钟运行一次,将新到达的数据汇总到文件中。 第二个作业每30分钟运行一次,parsing聚集的数据并截断该文件以在接下来的30分钟内重置该数据。

显然每30分钟就有一个潜在的僵局。 有没有办法为第一个任务写cron作业,以便每分钟只执行29分钟(不包括每分钟1-60,不包括30和60),然后在第31分钟重新开始? 谢谢!

编辑

通过请求,我使用PHP来执行这些操作(因为涉及到数据结构的一些重要用途)。 我已经实现了使用PHP的flock函数,而函数的文档指定阻塞直到1)获得locking,或者2)指定了LOCK_NB选项,这让我感到困惑的是,下面的例子似乎暗示即使是阻塞呼叫,也可能无法获得locking。

除非这是由于其他问题(权限,操作系统中断等)? 这个阻塞直到获得锁的问题真的是我的问题的动机,看看是否有另一种方法来完全避免locking文件,从而减轻了非阻塞锁试图失败和脚本停止的风险。

你不想这样做; 有一次你的工作需要一分钟以上,你将会被洗脑。 像这样的竞争条件造成了丑陋的问题:间歇性的,不可预知的,难以诊断的。

Pboin是完全正确的:你需要在你的代码中探索信号量的使用,然后这个问题就消失了,你根本就不用担心计划冲突。

你使用什么语言?

编辑 (为php而道歉,暂时还没有用过,有点醉,所以不能编译):

locking的“常用”方法是检查锁(在这种情况下,我试图获得锁),如果有锁,则执行一个简短的等待并重试。 你可以尝试在while循环中使用php的sleep()函数,例如:

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

我使用类似于这个吨的基于cron的写作业。 奇迹般有效。 它实际上是一种类似于ALOHA通信协议的方法,与后来称为“TCP / IP”的networking协议非常相似。 尝试,尝试,然后再试一次。

那么,你可以按照你的build议在cron中列出你的分钟数,但是这不是真的解决了这个问题。 (一方面,cron不保证在任何给定的时间内执行。)

你可能会更好地在你的脚本中实现一些lockingfunction – 这是less得可怜的。 高级Bash脚本指南 ,一个很好的免费资源build议lockfile命令,这将帮助你做到这一点。

通过正确地做到这一点,你会less得多担心。