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以便容器立即停止以及出现这种行为的原因是什么?