环境:Raspberry Pi Wheezy
我有一个使用Popen调用另一个python程序的python程序
from subprocess import *
oJob = Popen('sudo python mypgm.py',shell=True)
另一个菜单选项应该立即结束工作
oJob.kill()
但作业还在运行?
答案 0 :(得分:1)
您需要添加创建标志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
:
答案 1 :(得分:1)
当您添加选项python mymgm.py
时,python会启动一个shell,然后shell会启动进程oJob.kill
。你在这里杀死shell进程,它不会杀死运行mymgm.py的子进程。
为确保该子进程在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
当您向shell进程发送echo (5243960811416 & 4040906070209050);
信号时,它也将终止其所有子进程。