GNU/Linux >> LINUX-Kenntnisse >  >> Linux

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

Lösung 1:

Ich habe das Problem mit Supervisor eventlistener gelöst :

[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

Lösung 2:

Hier ist eine etwas schlankere Version, die ein Shell-Skript anstelle eines Python-Skripts verwendet und auch mehrere Dienste abdeckt, wodurch der gesamte Supervisor zerstört wird, wenn einer von 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

Referenzen

  • Prozessmanagement in Docker-Containern
  • Supervisor wird beendet, wenn einer seiner untergeordneten Prozesse fehlschlägt

Linux
  1. Wie ersetzt man ein Zeichen durch ein anderes in allen Dateinamen der aktuellen Verzeichnisse?

  2. Wie ersetze ich alle Semikolons nach dem ersten?

  3. So aktualisieren Sie Kali Linux mit einem einzigen Befehl

  4. Wie setze ich Passwort-Zip-Dateien mit Command in allen Betriebssystemen?

  5. Wie finde ich alle untergeordneten Prozesse?

So laden und extrahieren Sie Tar-Dateien mit einem Befehl

So übertragen Sie Dateien mit Commander One

Wie beendet man alle Hintergrundprozesse in zsh?

So konfigurieren Sie den Supervisor im Docker richtig

So beenden Sie alle von pgrep zurückgegebenen Prozesse

Wie beende ich alle Prozesse eines Benutzers mit seiner UID?