【问题标题】:Execute background process from django that can't be interrupted by the web server从 django 执行无法被 Web 服务器中断的后台进程
【发布时间】:2010-11-17 20:02:23
【问题描述】:

我看到了各种各样的主题,他们已经接受了答案,但我仍然坚持这一点。

我有一个应该启动备份过程的视图,并且我得到了视图返回的位置,并且该进程仍在后台运行,但是 如果重新启动 apache,然后备份进程终止。

def partStartJob(request):
    import subprocess
    p=subprocess.Popen(['/usr/bin/nohup','/usr/bin/python', '/(somewhere)/scripts/backup/testbackup.py'] )
    # FIXME: This process dies when apache restarts.

提前致谢。

【问题讨论】:

    标签: python django linux apache background


    【解决方案1】:

    您需要使用完全独立的过程进行备份。做到这一点的最好方法是使用消息队列 - 视图将备份请求放在队列中,一个单独的侦听器拾取它并运行备份,独立于 Apache。

    Celery 是一个分布式任务管理器,可以为您处理所有这些问题,尽管使用 RabbitMQ 和 Python AMQP 库来开发您自己的任务相当容易。

    【讨论】:

    • 我很欣赏这一点,但它就是不合适。我不想安装一个库来完成我知道我的系统必须能够做的事情。
    • 你的系统可以做到,但它不能检查操作的结果,确保最终操作成功,或者你想要的任何其他事情,比如这样的任务.是的,你必须安装一些额外的库,但与 Django 本身相比,celery + rabbitMQ 是微不足道的。
    【解决方案2】:

    也许不那么优雅,但绝对是最简单的,我使用 at 命令将我的流程安排在“现在”。完成。

    os.system("echo '/usr/bin/python /(somewhere)/scripts/backup/testbackup.py' | at now")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 2015-10-18
      • 2013-06-14
      • 1970-01-01
      相关资源
      最近更新 更多