【问题标题】:Preventing management commands from running more than one at a time防止管理命令一次运行多个
【发布时间】:2012-01-03 21:09:40
【问题描述】:

我正在设计一个由 Django 管理命令触发的长时间运行的进程,该进程需要相当频繁地运行。这个进程应该通过一个 cron 作业每 5 分钟运行一次,但我想阻止它在第一个需要超过 5 分钟的极少数情况下运行该进程的第二个实例。

我考虑过创建一个在管理流程开始时创建并在流程结束时删除的触摸文件。然后,第二个管理命令进程将检查以确保触摸文件在运行之前不存在。但是,如果一个进程在没有正确删除触摸文件的情况下突然死亡,这似乎是一个问题。似乎必须有更好的方法来进行检查。

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

【问题讨论】:

  • ps -ef 怎么样? (或PSI
  • FWIW,触摸文件方法的一个简单修复方法是在过程中的每个迭代或步骤中继续触摸文件。然后,您可以检查文件的修改日期(如果存在),如果在合理的时间内没有被修改,则忽略/删除它。
  • 谢谢克里斯。这似乎是一种不错的轻量级方法。

标签: python django command


【解决方案1】:

出于这个原因,我更喜欢让其工作脱离共享队列的长时间运行的进程。长期运行是指它的生命周期比单个工作单元长。然后该进程由一些守护程序服务控制,例如supervisord,它可以在进程崩溃时接管重新启动进程的控制权。这会将工作适当地委派给知道如何管理进程生命周期的人员,并使您不必担心脚本范围内的 posix 进程的细节。

如果您有一个队列,您还可以启动多个进程,每个进程都可以从队列中取出作业并处理它们,但这听起来超出了您的问题范围。

【讨论】:

  • 谢谢你迈克尔,芹菜可能是要走的路。我想我可以让一个工作执行我的管理命令(或其他),并且在它完成时,让它在最近的 5 分钟标记另一个工作。我想这会阻止它一次运行多个实例。
  • 或者只是让长时间运行的进程每 5 分钟唤醒一次,如果它已经在 5 分钟标记处运行,显然可以避免这种逻辑。
猜你喜欢
  • 2013-05-27
  • 2019-06-24
  • 1970-01-01
  • 2011-10-04
  • 1970-01-01
  • 2016-12-26
  • 2013-06-08
  • 2018-06-27
  • 1970-01-01
相关资源
最近更新 更多