GNU/Linux >> Tutoriels Linux >  >> Linux

Comment quitter tous les processus de superviseur si l'un d'eux est sorti avec 0 résultat

Solution 1 :

J'ai résolu le problème avec le superviseur 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**

Aussi une bonne gestion du processus d'article dans les conteneurs Docker

Solution 2 :

Voici une version légèrement plus simplifiée qui utilise un script shell au lieu d'un script python, et couvre également plusieurs services, tuant l'ensemble du superviseur en cas d'échec.

superviseur.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

Références

  • Gestion des processus dans les conteneurs Docker
  • Tuer le superviseur si l'un de ses processus enfants échoue

Linux
  1. Comment remplacer un caractère par un autre dans tous les noms de fichiers des répertoires actuels ?

  2. Comment mettre à jour Kali Linux avec une seule commande

  3. Comment trouver tous les processus enfants ?

  4. Comment attendre la sortie des processus non enfants

  5. Comment exécuter plusieurs processus Tor à la fois avec différentes adresses IP de sortie ?

Comment télécharger et extraire des fichiers tar avec une seule commande

Comment transférer des fichiers avec Commander One

Comment configurer correctement le superviseur dans Docker

Comment remplacer tout le contenu d'un dossier par un autre

Comment tuer tous les processus d'un utilisateur à l'aide de son UID

Comment lister tous les utilisateurs avec root ?