2012-01-03 59 views
2

我正在设计一个长时间运行的进程,由Django管理命令触发,需要在相当频繁的基础上运行。这个过程应该每5分钟通过一个cron作业来运行,但是我想阻止它在第一个需要5分钟以上的罕见情况下运行第二个过程实例。防止管理命令一次运行多个

我想过创建一个触摸文件,在管理进程启动时创建并在进程结束时删除。然后,第二个管理命令过程将在运行之前检查以确保触摸文件不存在。但是,如果某个进程在没有正确删除触摸文件的情况下突然死亡,那看起来就像是个问题。似乎有一个更好的方法来做这个检查。

有没有人知道有什么好的工具或模式来帮助解决这类问题?

+0

ps -ef怎么样? (或[PSI](http://www.psychofx.com/psi/)) – danihp 2012-01-03 21:13:10

+1

FWIW,触摸文件方法的简单修复方法是在每次迭代或步骤中继续触摸文件。然后,您可以检查文件的修改日期(如果存在),并在合理的时间内未修改文件时忽略/删除它。 – 2012-01-03 22:52:34

+0

谢谢克里斯。这似乎是一个不错的轻量级方法。 – 2012-01-03 23:38:03

回答

3

因此,我宁愿有一个长时间运行的进程从共享队列中获取工作。长期来看,我的意思是说,它的一生比一个单位的工作长。然后,该进程由一些守护程序服务(如supervisord)控制,该服务可以在发生崩溃时接管重新启动进程的控制权。这将工作恰当地委托给了解如何管理流程生命周期并使您不必担心脚本范围内posix流程的实质。

如果你有一个队列,你也可以启动多个进程,每个进程可以将工作从队列中移出并处理,但这听起来像是超出了你的问题范围。

+0

谢谢迈克尔,芹菜可能是要走的路。我想我可以有一份工作来执行我的管理命令(或其他),并且当它完成时,让它安排另一份工作,最近的时间为5分钟。我想这样可以防止它一次运行多个实例。 – 2012-01-03 23:37:19

+0

或者只是长时间运行的过程每5分钟唤醒一次,显然如果它已经在5分钟的时间内运行,就会避免这种逻辑。 – 2012-01-04 00:13:41