GNU/Linux >> Linux Esercitazione >  >> Linux

Come uscire da tutti i processi del supervisore se uno è uscito con 0 risultati

Soluzione 1:

Ho risolto il problema con il supervisore 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**

Buona anche la gestione del processo degli articoli nei contenitori docker

Soluzione 2:

Ecco una versione leggermente più snella che fa uso di uno script di shell invece di uno script python e copre anche più servizi, uccidendo l'intero supervisore se uno dei due fallisce.

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

Riferimenti

  • Gestione dei processi nei container Docker
  • Uccidere il supervisore se uno dei suoi processi figlio fallisce

Linux
  1. Come uccidere tutti i processi tranne uno specifico?

  2. Come aggiornare Kali Linux con un solo comando

  3. Come trovare tutti i processi figlio?

  4. Come trovare tutti i file che terminano con .rb con Linux?

  5. Come uccidere tutti i processi con un determinato nome parziale?

Come scaricare ed estrarre file Tar con un comando

Come trasferire file con Commander One

Come attendere l'uscita dei processi non figli

Come eseguire più processi Tor contemporaneamente con diversi IP di uscita?

Come uccido tutti i processi di un utente usando il loro UID

Come faccio a elencare tutti gli utenti con root?