GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo salir de todos los procesos de supervisor si uno salió con 0 resultados

Solución 1:

Resolví el problema con el 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

matar.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**

También buena gestión de procesos de artículos en contenedores docker

Solución 2:

Aquí hay una versión un poco más optimizada que utiliza un script de shell en lugar de un script de python, y también cubre múltiples servicios, matando a todo el supervisor si alguno falla.

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

Referencias

  • Gestión de procesos en contenedores Docker
  • Matar al supervisor si alguno de sus procesos secundarios falla

Linux
  1. ¿Cómo reemplazar un carácter con otro en todos los nombres de archivo de los directorios actuales?

  2. ¿Cómo matar todos los procesos aparte de uno específico?

  3. Cómo actualizar Kali Linux con un solo comando

  4. ¿Cómo configurar archivos comprimidos con contraseña con comando en todos los sistemas operativos?

  5. ¿Cómo encontrar todos los procesos secundarios?

Cómo descargar y extraer archivos Tar con un solo comando

¿Cómo reinstalar todos los paquetes instalados con Zypper?

¿Cómo reemplazar todos los puntos y comas después del primero?

Cómo transferir archivos con Commander One

Cómo reemplazar todo el contenido de una carpeta con otra

¿Cómo enumero a todos los usuarios con root?