为什么kill命令无法终止nohup python线程

时间:2017-03-23 06:45:57

标签: python multithreading signal-processing

代码:

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的情况下,主线程似乎无法处理信号...

2 个答案:

答案 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(),只需睡眠即可。