Làm thế nào để thoát tất cả các quy trình giám sát nếu một thoát với kết quả 0


14

Tôi chạy container docker với người giám sát như thế này:

Dockerfile

CMD ["/run.sh"]

chạy

#!/usr/bin/env bash
exec supervisord -n

giám sát-serf.conf

[group:job]
programs=serf,producer

[program:serf]
command=/start-serf-agent.sh
numprocs=1
autostart=true
autorestart=unexpected
stopasgroup=true
killasgroup=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

bắt đầu -sf-agent.sh

#!/bin/bash
exec serf agent --join=serf:7946 -tag role=producer

giám sát viên

[program:producer]
command=/start.sh
numprocs=1
stopasgroup=true
killasgroup=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

bắt đầu

#!/bin/bash
exec /producer --project=${NAME}

Sau khi nhà sản xuất dừng lại, tôi đã nhận được:

producer_1 |     2016/02/29 21:59:50 [INFO] serf: EventMemberLeave: 7c4fbc80af97 172.19.0.2
producer_1 | 2016/02/29 21:59:51 INF    1 stopping
producer_1 | 2016/02/29 21:59:51 INF    1 exiting router
producer_1 | 2016-02-29 21:59:51,281 INFO exited: producer (exit status 0; expected)
producer_1 |     2016/02/29 21:59:51 [INFO] agent: Received event: member-leave

nhưng serf-agent giữ container ở trạng thái chạy. Tôi muốn dừng bộ chứa Docker khi nhà sản xuất hoàn thành công việc của mình đúng với trạng thái 0. Tôi đã cố gắng tham gia các quy trình vào một nhóm nhưng dường như không hoạt động. Các bạn, tôi đã bỏ qua những gì? Làm ơn giúp tôi với!


bản sao có thể của serverfault.com/questions/735328/
Mạnh

Câu trả lời:


8

Tôi giải quyết vấn đề với người giám sát eventlistener :

[program:worker]
command=/start.sh
priority=2
process_name=worker
numprocs=1
stopasgroup=true
killasgroup=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

[eventlistener:worker_exit]
command=/kill.py
process_name=worker
events=PROCESS_STATE_EXITED

kill.py

#!/usr/bin/env python
import sys
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')
       line = sys.stdin.readline()
       write_stdout('This line kills supervisor: ' + line);
       try:
               pidfile = open('/var/run/supervisord.pid','r')
               pid = int(pidfile.readline());
               os.kill(pid, signal.SIGQUIT)
       except Exception as e:
               write_stdout('Could not kill supervisor: ' + e.strerror + '\n')
       write_stdout('RESULT 2\nOK')
if __name__ == '__main__':
   main()
   import sys
main issue I forgot to point to **process_name**

Ngoài ra quản lý quá trình bài viết tốt trong container docker


Nội dung của tập lệnh kill.py là gì?
Piotr Kieszczyński

@ PiotrKieszczyński đã được cập nhật, hãy nhìn vào, xin vui lòng
Vitaly Velikodny

3

Đây là một phiên bản được sắp xếp hợp lý hơn một chút, sử dụng tập lệnh shell thay vì tập lệnh python và cũng bao gồm nhiều dịch vụ, giết chết toàn bộ người giám sát nếu thất bại.

giám sát
$ cat /etc/supervisord.conf
[supervisord]
nodaemon=true
loglevel=debug
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/run/supervisord.pid
childlogdir=/var/log/supervisor

[program:service1]
command=/usr/sbin/service1
user=someone
autostart=true
autorestart=true
startsecs=30
process_name=service1

[program:service2]
command=/usr/sbin/service2
user=root
autostart=true
autorestart=true
startsecs=30
process_name=service2

[eventlistener:processes]
command=stop-supervisor.sh
events=PROCESS_STATE_STOPPED, PROCESS_STATE_EXITED, PROCESS_STATE_FATAL
stop-supervisor.sh
$ cat stop-supervisor.sh
#!/bin/bash

printf "READY\n";

while read line; do
  echo "Processing Event: $line" >&2;
  kill -3 $(cat "/var/run/supervisord.pid")
done < /dev/stdin

Người giới thiệu


1
Bạn không quên các sự kiện trong cấu hình ở đây? Và cấu hình của bạn không có tham chiếu đến stop-supervisor.sh
rfay

stop-supervisor.sh được kích hoạt ở đâu?
Pieter

@Pieter - cảm ơn, nó đã bị băm nhỏ khi tôi dán nó vào, tôi đã sửa nó.
slm

0

Đây là một giải pháp đơn giản cho Docker. Trong của bạn supervisord.conf, thay thế này:

[program:something]
command = something

Với cái này:

[program:something]
command = sh -c 'something && kill 1'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.