Python 波本对杀戮没有反应
环境:树莓皮喘息 我有一个python程序,它使用Popen调用另一个python程序Python 波本对杀戮没有反应,python,bash,raspberry-pi,Python,Bash,Raspberry Pi,环境:树莓皮喘息 我有一个python程序,它使用Popen调用另一个python程序 from subprocess import * oJob = Popen('sudo python mypgm.py',shell=True) 另一个菜单选项应该立即结束作业 oJob.kill() 但是作业仍在运行???您需要添加一个创建标志arg oJob = Popen('sudo python mypgm.py',shell=True, creationflags = subprocess.C
from subprocess import *
oJob = Popen('sudo python mypgm.py',shell=True)
另一个菜单选项应该立即结束作业
oJob.kill()
但是作业仍在运行???您需要添加一个创建标志arg
oJob = Popen('sudo python mypgm.py',shell=True, creationflags = subprocess.CREATE_NEW_PROCESS_GROUP)
subprocess.CREATE_NEW_PROCESS_GROUP
Popen creationflags参数,用于指定将创建新进程组。此标志对于在子流程上使用os.kill()是必需的
编辑我同意关于如何导入内容以及为什么要获取内容的评论,但没有定义。另外,另一个答案似乎在正确的轨道上获得pid
import subprocess as sub
oJob = sub.Popen('sudo python mypgm.py', creationflags = sub.CREATE_NEW_PROCESS_GROUP)
oJob.kill()
警告:执行包含来自不受信任源的未初始化输入的shell命令会使程序易受shell注入攻击,这是一个严重的安全缺陷,可能导致任意命令执行。因此,在命令字符串由外部输入构成的情况下,强烈建议不要使用shell=True
:
当您添加选项
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
信号时,它也将杀死其所有子进程。我使用的是“fromsubprocessimport*”,它表示subprocess not definedThen您已经将CREATE\u NEW\u process\u GROUP导入全局名称空间。但是,无论如何,您不应该使用子流程导入中的*
。使用导入子流程
或仅指定要导入的名称。例如,从子流程导入Popen,创建新的流程组
@Rod Yes这应该对pi有效。这是内置的子流程模块。任何标准python版本都会有它。AttributeError“module”对象没有名为CREATE\u NEW\u PROCESS的属性_GROUP@Rod,creationflags
是Windows的东西。除了其他人提出的(有效/正确的)观点,即shell=True
是邪恶的之外,你不能杀死一个你不拥有的工作,而且sudo
使作业归root所有,而不是您自己。如果在我的python pgm上执行chgmod+x,我会收到一条关于wiringPi需要sudo使用wiringpisetup的错误消息,您需要的sudo
不会阻止它使您无法向如此提升的进程发送信号——因此,我真的不知道你上述评论的目的是什么。现在,您可以sudo kill${pid}
,对于oJob
的进程ID,这样您的kill也有升级权限,或者您可以在sudo
下运行整个程序,这样就已经有了启动和kill的升级权限,从而避免再次需要使用sudo
。可能是真的,也许不是。有些shell会自动执行调用它们的字符串中的最后一个命令。