杀死由Python执行的后台进程

1 投票
1 回答
2571 浏览
提问于 2025-04-28 16:29

我有一个脚本

import os
os.system('python manage.py runserver')

这个脚本启动了django服务器(不管它具体做什么,反正只要按下ctrl+c或其他快捷键就会停止)。

我想要的是通过其他方式停止服务器,而不是通过杀掉它的进程ID。


我尝试过的:

我试着使用subprocess库和它的kill命令,具体可以参考这里:如何终止一个用shell=True启动的python子进程

但是这并没有帮助。因为我猜,问题在于:我们杀掉的不是manage.py runserver这个进程,而是执行python manage.py runserver的那个进程。所以,杀掉这个进程后,服务器仍然在运行。

我还尝试过使用terminate方法:

p = subprocess.Popen('python manage.py runserver', stdout=subprocess.PIPE, shell=True)
time.sleep(5)
p.terminate()

我认为它应该是这样的:服务器启动后5秒钟就停止,但实际上它从来没有停止过。

有没有什么办法可以杀掉这个进程呢?

暂无标签

1 个回答

3

这听起来不太靠谱。 请不要这样做!

Django建议使用WSGI,这样可以让网络服务器(比如Apache、NginX等)自动加载和卸载Django,方便又省事。这里有详细的做法。另外,Django自带的网络服务器在安全性和扩展性上都不太行,不建议在生产环境中使用。总的来说,别这么做!

如果你不想用WSGI,也可以通过Apache做一个代理转发,或者用NginX等其他方法。Django服务器本身可以用很多系统服务工具来管理,比如init.dsupervisord

直接回答你的问题,你可以用process.terminate()来结束通过subprocess启动的活动进程,但用Python脚本自己来运行服务器并不是个好主意,因为还有很多其他更好的工具可以用。

撰写回答