gpt4 book ai didi

python - 在 python 中终止子进程

转载 作者:太空宇宙 更新时间:2023-11-04 06:38:45 27 4
gpt4 key购买 nike

根据我自己的调查完全重写

我有一个运行许多其他 python 脚本的主脚本。脚本创建为

from subprocess import STDOUT, Popen
from signal import SIGINT
import shlex
p = Popen(shlex.split("python somescript.py arg1 arg2"), cwd="../src/somedir", stderr=STDOUT)

并终止于

p.send_signal(SIGINT)
p.wait()

里面有如下代码

if __name__ == "__main__":

import signal
def terminate(*args):
raise KeyboardInterrupt
signal.signal(signal.SIGINT, terminate)

# do some work here

每个脚本都有一些功能

try:
# create workers
except KeyboardInterrupt:
# cleanup, wait for the current worker to end, then return

所有描述的工作都按预期进行 - 主脚本创建进程,当它执行结束时,它向它们发送 SIGINT,它们以正确的方式处理它,优雅地退出。

现在,我想以同样的方式运行 Django 开发服务器。

我修改了 manage.py 文件:

if __name__ == "__main__":
import signal
def terminate(*args):
print 'got SIGINT'
raise KeyboardInterrupt
signal.signal(signal.SIGINT, terminate)

execute_manager(settings)

多次调用后,execute_manager 函数导致 django 命令方法具有 except KeyboardInterrupt block 和 sys.exit(0) .所以,整个设置看起来是一样的。

问题:django 服务器实际上并没有停止,尽管我看到了 got SIGINT 输出。

可能是一个解释:

看起来像 django manage.py forks 自己,或者做类似的事情;查看 Activity Monitor(osx 的进程资源管理器)我看到启动了 3 个 python 进程 - 一个用于主脚本,可能还有 2 个用于 manage.py。终止时,其中 2 个停止(主脚本,以及我用 p 链接到的那个),而第三个继续锁定 8000 端口。有没有办法获取进程的子进程 pids?

最佳答案

您可以使用 psutil找出有关子进程的信息,例如在伪代码中:

p = Popen(...)
pp = psutil.Process(p.pid)
for child in pp.get_children():
child.send_signal(signal.SIGINT)

注意在不使用 --reload 的情况下运行时的进程差异,使用 ps -ef | 获得grep 管理.py | grep -v grep:

vinay 7864 7795  9 22:10 pts/0 00:00:00 python ./manage.py runserver
vinay 7865 7864 16 22:10 pts/0 00:00:00 /usr/bin/python ./manage.py runserver

与使用 --noreload 选项相比:

vinay 7874 7795  7 22:10 pts/0 00:00:00 python ./manage.py runserver --noreload

关于python - 在 python 中终止子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4554767/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com