从Django执行后台进程,且不受Web服务器干扰
我看到很多类似的讨论,里面都有被认可的答案,但我还是解决不了我的问题。
我有一个界面,应该用来启动备份程序。我已经做到让这个界面可以返回结果,备份过程也在后台运行。不过如果重启了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")