Popen没有回应杀人

时间:2015-05-22 01:54:48

标签: python bash raspberry-pi

环境:Raspberry Pi Wheezy

我有一个使用Popen调用另一个python程序的python程序

from subprocess import *

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

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

oJob.kill()

但作业还在运行?

2 个答案:

答案 0 :(得分:1)

您需要添加创建标志arg

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

source

  

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); 信号时,它也将终止其所有子进程。