从Django执行后台进程,且不受Web服务器干扰

3 投票
2 回答
1518 浏览
提问于 2025-04-16 07:14

我看到很多类似的讨论,里面都有被认可的答案,但我还是解决不了我的问题。

我有一个界面,应该用来启动备份程序。我已经做到让这个界面可以返回结果,备份过程也在后台运行。不过如果重启了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 个回答

8

你需要用一个完全独立的程序来进行备份。最好的方法是使用消息队列——视图把备份请求放到队列里,然后一个独立的监听器去取这个请求并执行备份,这个过程和Apache是没有关系的。

Celery 是一个分布式任务管理工具,可以帮你处理这些事情,虽然用RabbitMQ和Python的AMQP库自己做一个也挺简单的。

2

可能不太优雅,但绝对是最简单的,我用at命令把我的任务安排在“现在”执行。就这样。

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

撰写回答