python - Popen 没有响应杀死

标签 python bash raspberry-pi

环境:Raspberry Pi Wheezy

我有一个Python程序,它使用Popen调用另一个Python程序

from subprocess import *

oJob = Popen('sudo python mypgm.py',shell=True)

另一个菜单选项应该立即结束作业

oJob.kill()

但作业仍在运行?

最佳答案

当您添加选项 shell=True 时,python 会启动一个 shell,而该 shell 又会启动进程 python mymgm.py。您正在此处终止 shell 进程,该进程不会终止运行 mymgm.py 的自己的子进程。

为了确保子进程在 oJob.kill 上被杀死,您需要将它们全部分组到一个进程组下,并让 shell 进程成为组的领导者。 代码是,

import os
import signal
import subprocess

# The os.setsid() is passed in the argument preexec_fn so
# it's run after the fork() and before  exec() to run the shell.
pro = subprocess.Popen(cmd, stdout=subprocess.PIPE, 
                       shell=True, preexec_fn=os.setsid) 

os.killpg(pro.pid, signal.SIGTERM)  # Send the signal to all the process groups

当您向 shell 进程发送 SIGTERM 信号时,它也会杀死其所有子进程。

关于python - Popen 没有响应杀死,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30387180/

相关文章:

python - 如何按最大日期时间过滤数据框中的行?

python - 在 Django 中返回距离对象

python - 为什么 pylint 告诉我我的 dict 属性是一个 undefined variable ?

python - 将 Azure Blob CSV 读取到 Python Pandas DF 中的问题

python - 在 Raspberry pi 上安装 Informix Client SDK

python - 用kivy按下按钮时如何更改空格?

python - 在python中设置环境变量

Python:subprocess.call 破管

bash - 递归列出隐藏文件,无需 ls、find 或 Extendedglob

c++ - 有什么方法可以将 EGL 绘制到/dev/fb1 而不是/dev/fb0 而无需在 Raspberry Pi 上复制数据?