代码:
res = Subprocess.Popen(cmd,executable="/bin/bash", shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
while not res.poll():
do something....
我运行python代码,如: nohup python my_script.py&
然后我想终止sctipt:
kill pid_of_the_script
但它不起作用(所以由Subprocess.Popen创建的cmd procss仍将存在)我必须使用:
kill -9 pid_of_the_script
为什么kill命令在这里不起作用?
因为kill -9既没有杀死cmd进程,也没有 当我捕获SIGTERM信号时(这就是问题,就像我发送一个kill命令,脚本无法捕获此信号,我将SIGTERM信号注册到信号处理程序),处理程序首先杀死cmd进程然后使用kill -9来杀死脚本本身(基于pid)。
更新: 也许thread.join()方法会导致这种情况。 在主线程中调用join的情况下,主线程似乎无法处理信号...
答案 0 :(得分:0)
如果您无法退出打开命令窗口的进程,可以尝试使用os.exit(1)
来为您完成工作。
答案 1 :(得分:0)
我使用以下代码作为解决方法:
thread1.start() # process in thread1 is an infinite task
while some_condition: # use a infinite loop here
time.sleep(10)
thread1.join() # join after the loop, so before calling join, the
# main thread can response to the signals
添加信号处理程序:
def signal_handler(signum, frame):
print "receive sig %d " % signum
# kill the process started by thread1
...
# modify condition value here, so the above infinite loop can exit now
...
将信号处理程序注册到SIGTERM
signal.signal(signal.SIGTERM, signal_handler)
现在我可以使用ctrl + C或kill来终止主进程及其子进程。
由于thread1中的任务是无限的,似乎将其设置为守护程序线程也可以正常工作,因此主线程无需调用join(),只需睡眠即可。