无法将SIGKILL发送给supervisord

时间:2018-02-22 10:30:21

标签: python docker process supervisord

Supervisord在docker容器中运行。它产生了几个过程。其配置如下:

[supervisord]
nodaemon = true

[group:maria-as]
programs=p1,p2

[program:p1]
priority = 1
command = bash ./launcher.sh
stopasgroup=true
killasgroup=true
autorestart=false

[program:p2]
priority = 1
command = bash ./launcher2.sh
stopasgroup=true
killasgroup=true
autorestart=false

[eventlistener:subprocess_stop]
events=PROCESS_STATE_EXITED,PROCESS_STATE_FATAL,PROCESS_STATE_STOPPED,PROCESS_STATE_BACKOFF
command=/kill.py

我的目标是在其中一个子进程发生故障后终止其所有子进程的supervisord。因此实现了事件监听器,将SIGKILL发送给supervisord。

kill.py 代码如下:

#!/usr/bin/env python

import os
import signal

def write_stdout(s):
   sys.stdout.write(s)
   sys.stdout.flush()
def write_stderr(s):
   sys.stderr.write(s)
   sys.stderr.flush()

def main():
   while 1:
       write_stdout('READY\n')
       try: 
            print time.time()
            os.kill(1, signal.SIGKILL)
            print time.time()
       except Exception as e:
               write_stderr('Could not kill supervisor: ' + e.strerror + '\n')
       write_stdout('RESULT 2\nOK')
if __name__ == '__main__':
   main()   

但是一旦其中一个子流程发生故障就没有任何反应。

更有趣的是,在容器内运行 kill -9 1 也没有任何效果。

kill -9 -1 导致容器停机,但需要几秒钟。

如何将SIGKILL发送给supervisord以便容器立即停止以及出现这种行为的原因是什么?

0 个答案:

没有答案