【问题标题】:Kill the background process executed by python杀死python执行的后台进程
【发布时间】:2014-10-20 23:14:57
【问题描述】:

我有一个脚本

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

脚本启动 django 服务器(不管它做什么,它可以是任何在ctrl+c 或另一个快捷键被按下之前执行的命令)。

我想要的是通过任何方式停止服务器,而不是通过 pid 杀死它。


我尝试过的:

我尝试使用subprocess lib,它是kill 命令,如下所述:How to terminate a python subprocess launched with shell=True

但这无济于事。我猜,原因是:我们杀死的不是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 秒后停止,但它永远不会停止。

有没有办法杀死进程?

【问题讨论】:

  • 您是否创建了一个新的流程组作为您链接的问题的答案所建议的? runserver 不会妖魔化服务器进程,因此配方应该可以工作。
  • 如果您不从管道读取数据,请不要使用stdout=PIPE。使用DEVNULL instead if you want to discard the output
  • 非常感谢!我刚刚再次尝试了我已链接的问题的答案,并且......一切正常。我不知道为什么它第一次不起作用,但现在它完全符合我的要求。因此,感谢您再次向我指出该问题,并再次感谢您提供 DENVULL(不受欢迎的输出是我的第二个问题)

标签: python django pid


【解决方案1】:

这听起来很可疑。请不要这样做!

Django 建议使用 WSGI 来允许网络服务器(Apache、NginX 等)根据需要自动加载和卸载 Django。 Here's how to do that。此外,Django 的内置 Web 服务器不被视为 secure or scalable。一般来说,不要那样做!

如果你不喜欢使用 WSGI,你也可以做一个proxypass with ApacheNginX 等。Django 服务器本身可以由任意数量的系统服务工具管理,比如init.dsupervisord .

要直接回答您的问题,您可以使用process.terminate() 来终止使用subprocess 启动的活动进程,但是当存在许多其他出色的工具时,使用python 脚本自行运行服务器是一个糟糕的主意。

【讨论】:

  • 问题是:对于开发,我想要一个命令来启动本地网络服务器、coffee 和更少的编译器。一个命令同时杀死他们
  • terminate 命令不起作用,更新我的问题以显示我如何处理终止
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
  • 2017-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多