Bagaimana cara keluar dari semua proses penyelia jika ada yang keluar dengan 0 hasil

14

Saya menjalankan buruh pelabuhan dengan atasan seperti ini:

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}

Setelah produser berhenti, saya mendapat:

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

tetapi agen-budak membuat wadah dalam kondisi berjalan. Saya ingin menghentikan wadah Docker ketika produser menyelesaikan pekerjaannya dengan benar dengan status 0. Saya mencoba untuk bergabung dengan proses ke satu grup tetapi tampaknya tidak berhasil. Kawan, apa yang saya lewati? Tolong bantu aku!

Vitaly Velikodny
sumber
kemungkinan
ditipu

Jawaban:

8

Aku menyelesaikan masalah dengan supervisor 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**

Juga manajemen proses artikel yang baik dalam wadah buruh pelabuhan

Vitaly Velikodny
sumber
Apa isi skrip kill.py?
Piotr Kieszczyński
@ Pos PiotrKieszczyński telah diperbarui, lihat, tolong
Vitaly Velikodny
3

Berikut adalah versi yang sedikit lebih ramping yang menggunakan skrip shell alih-alih skrip python, dan juga mencakup beberapa layanan, membunuh seluruh pengawas jika gagal.

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

Referensi

slm
sumber
1
Tidakkah Anda lupa eventersten di konfigurasi di sini? Dan konfigurasi Anda tidak memiliki referensi ke stop-supervisor.sh
rfay
di mana stop-supervisor.sh dipicu?
Pieter
@Pieter - terima kasih, cincang ketika saya menempelkannya, saya sudah memperbaikinya.
slm
0

Inilah solusi sederhana untuk Docker. Di Anda supervisord.conf, ganti ini:

[program:something]
command = something

dengan ini:

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