我在一个WindowsDocker容器中运行一个非常基本的Python循环示例,我希望优雅地停止它。在
脚本在我的dockerfile中是这样启动的:
CMD [ "python.exe" , "./test.py"]
在docker文档中,有人说一个SIGTERM信号被发送到主命令,所以我试图用这种方式捕捉它:
import signal
import time
import logging, sys
class GracefulKiller:
kill_now = False
def __init__(self):
signal.signal(signal.SIGINT, self.exit_gracefully)
signal.signal(signal.SIGTERM, self.exit_gracefully)
def exit_gracefully(self,signum, frame):
self.kill_now = True
if __name__ == '__main__':
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
killer = GracefulKiller()
while True:
time.sleep(1)
logging.info("doing something in a loop ...")
if killer.kill_now:
break
logging.info("End of the program. I was killed gracefully :)")
理论上,信号应该被处理器捕获,布尔值应该被切换,循环应该退出并显示我最后的日志行。它没有,它只是在信号发出的那一刻停止整个过程(或者更确切地说是2-3秒之后)
^{pr2}$我的最后一行日志从未到达。 有人知道发生了什么事吗?这是python特有的问题,docker特有的还是Windows特有的?在
我还试着用docker日志检查停止的容器,最后一个日志也不在这里。试着在它之后加一个睡眠,结果是一样的。在
谢谢
抓住
KeyboardInterrupt
就这样。在相关问题 更多 >
编程相关推荐