从django执行后台进程,不能被Web服务器中断

时间:2010-11-17 20:02:23

标签: python django linux apache background

我看到各种各样的线程,他们接受了答案,但我仍然坚持这个。

我有一个应该启动备份程序的视图,我把它恢复到视图返回的程度,并且该进程仍然在后台运行,但如果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.

提前致谢。

2 个答案:

答案 0 :(得分:8)

您需要使用完全独立的备份进程。执行此操作的最佳方法是使用消息队列 - 视图将备份请求放入队列,并且单独的侦听器将其拾取并运行备份,而不依赖于Apache。

Celery是一个分布式任务管理器,可以为您处理所有这些问题,尽管使用RabbitMQ和Python AMQP库可以很容易地完成自己的工作。

答案 1 :(得分:2)

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

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