我正在尝试在下面的函数中打开第二个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)
唯一可能相关的另一个问题是这是一个烧瓶脚本。我不确定这是否会改变。
答案 0 :(得分:0)
当您使用shell = True创建子进程时,实际上您生成了一个生成另一个子进程的进程,因此当您调用proc.kill()时,您只会终止父进程。您希望使您的子流程成为流程组负责人,以便您可以立即终止它们。
取消注释Popen调用中的setsid并像这样终止整个进程组:
os.killpg(proc.pid, signal.SIGTERM)