python子进程中的.kill()会杀死父进程而不是子进程

时间:2013-12-13 18:50:00

标签: python subprocess

我正在尝试在下面的函数中打开第二个python脚本的子进程。它似乎打开了进程,但是当我尝试结束进程时,父进程终止并且子进程仍然存在。有关为何可能发生这种情况的任何建议?

def thermostat(input):
global ThermostatRunning
global proc
print("Thermostat Function input: %s" % input)
if input == 'stop' and ThermostatRunning == 1:
    print("test")
    proc.kill()
    print proc.poll()
    dev2(0) #ensure heater is off
    return('Thermostat turned off')
elif input=='stop' and ThermostatRunning == 0:
    status = "Thermostat already stopped"
    print(status)
    return(status)
if input.isdigit() == 0:
        return("Thermostat input is not a number or -stop-")
if ThermostatRunning == 1:
    print("test2")
    proc.kill()
print("test3")
proc = subprocess.Popen('python thermostat.py -t %s' % input, shell=True)#, preexec_fn=os.setsid)
ThermostatRunning = 1
#for line in proc.stdout.readlines():
    #print (line)
status = "Thermostat started with set temperature: %s" % input
print(status)
return(status)

唯一可能相关的另一个问题是这是一个烧瓶脚本。我不确定这是否会改变。

1 个答案:

答案 0 :(得分:0)

当您使用shell = True创建子进程时,实际上您生成了一个生成另一个子进程的进程,因此当您调用proc.kill()时,您只会终止父进程。您希望使您的子流程成为流程组负责人,以便您可以立即终止它们。

取消注释Popen调用中的setsid并像这样终止整个进程组:

os.killpg(proc.pid, signal.SIGTERM)
相关问题