यदि कोई 0 परिणाम के साथ बाहर निकलता है तो सभी पर्यवेक्षक प्रक्रियाओं से बाहर कैसे निकलें


14

मैं इस तरह पर्यवेक्षक के साथ डॉक कंटेनर चलाता हूं:

Dockerfile

CMD ["/run.sh"]

run.sh

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

पर्यवेक्षक-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

पर्यवेक्षक-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}

निर्माता के रुकने के बाद मुझे मिल गया है:

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

लेकिन सर्फ़-एजेंट कंटेनर को चालू स्थिति में रखते हैं। मैं डॉकटर कंटेनर को रोकना चाहता हूं जब निर्माता 0. के साथ अपना काम ठीक से पूरा कर लेता है। मैंने प्रक्रियाओं को एक समूह में शामिल करने की कोशिश की, लेकिन लगता है कि यह काम नहीं करता है। दोस्तों, मैंने क्या छोड़ दिया? कृपया मेरी मदद करें!


जवाबों:


8

मैंने पर्यवेक्षक घटना सूची के साथ समस्या का समाधान किया :

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

डॉकटर कंटेनरों में अच्छा लेख प्रक्रिया प्रबंधन


किलफ्रेम स्क्रिप्ट की सामग्री क्या है?
पायोत्र किस्ज़्ज़स्की

@ PiotrKieszczyński पोस्ट को अपडेट किया गया है, कृपया देखें
विटाली वेलिकोडनी

3

यहां थोड़ा अधिक सुव्यवस्थित संस्करण है जो एक पायथन स्क्रिप्ट के बजाय शेल स्क्रिप्ट का उपयोग करता है, और कई सेवाओं को भी कवर करता है, यदि पूरी तरह से पर्यवेक्षक की हत्या करता है, तो या तो विफल हो जाता है।

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

संदर्भ


1
क्या आप यहाँ विन्यास में इवेंटस्लेर्स को नहीं भूले? और आपके विन्यास में रुकने का कोई संदर्भ नहीं है- supervisor.sh
rfay

रोक कहाँ है- supervisor.sh ट्रिगर?
Pieter

@ पीटर - धन्यवाद, जब मुझे इसमें चिपकाया गया तो यह कटा हुआ मिला, मैंने इसे ठीक कर लिया है।
SLM

0

यहाँ डॉकर के लिए एक सरल समाधान है। अपने में supervisord.conf, इस की जगह:

[program:something]
command = something

इसके साथ:

[program:something]
command = sh -c 'something && kill 1'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.