So beenden Sie alle Supervisor-Prozesse, wenn einer mit 0 beendet wurde

13

Ich führe einen Docker-Container mit einem Supervisor wie folgt aus:

Dockerfile

CMD ["/run.sh"]

run.sh

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

Supervisor-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

start-serf-agent.sh

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

Supervisor-servce.conf

[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

start.sh

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

Nachdem der Produzent aufgehört hat, habe ich:

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

aber Leibeigener-Agent halten Container im laufenden Zustand. Ich möchte den Docker-Container stoppen, wenn der Produzent seine Arbeit mit Status 0 ordnungsgemäß abgeschlossen hat. Ich habe versucht, Prozesse einer Gruppe zuzuordnen, aber es scheint nicht zu funktionieren. Leute, was habe ich übersprungen? Hilf mir bitte!

Vitaly Velikodny
quelle
möglicher Betrüger von serverfault.com/questions/735328/…
ibotty

Antworten:

8

Ich habe das Problem mit dem Supervisor Eventlistener behoben :

[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**

Auch gutes Artikelprozessmanagement in Docker-Containern

Vitaly Velikodny
quelle
Was ist der Inhalt des Skripts kill.py?
Piotr Kieszczyński
@ PiotrKieszczyński Beitrag wurde aktualisiert, schauen Sie bitte,
Vitaly Velikodny
3

Hier ist eine etwas optimierte Version, die ein Shell-Skript anstelle eines Python-Skripts verwendet und auch mehrere Dienste abdeckt, wodurch der gesamte Supervisor getötet wird, wenn einer der beiden fehlschlägt.

Supervisord.conf
$ 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

Verweise

slm
quelle
1
Hast du die Eventlstener in der Konfiguration hier nicht vergessen? Und Ihre Konfiguration hat keinen Verweis auf stop-supervisor.sh
rfay
Wo wird stop-supervisor.sh ausgelöst?
Pieter
@Pieter - danke, es wurde gehackt, als ich es einfügte, ich habe es repariert.
Slm
0

Hier ist eine einfache Lösung für Docker. supervisord.confErsetzen Sie dies in Ihrem :

[program:something]
command = something

mit diesem:

[program:something]
command = sh -c 'something && kill 1'
Kirill Bulygin
quelle