English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Guida all'uso dello strumento di gestione dei processi basato su Python supervisor

Supervisor è uno strumento di gestione dei processi basato su Python, che può essere eseguito solo su sistemi Unix-like, quindi non può essere eseguito su Windows. La versione ufficiale di Supervisor può essere eseguita solo su versioni di Python superiori a 2.4, ma non può ancora essere eseguita su Python 3, tuttavia esiste una versione di porting per Python 3 supervisor-py3k

In quali casi abbiamo bisogno della gestione dei processi? È quando dobbiamo eseguire programmi che devono essere eseguiti come processi di servizio, ad esempio un lavoro in background, il più comune che uso è per avviare e gestire programmi Web scritti in Tornado.

In addition, Supervisor can also manage the logs output by the program in a friendly way, can redirect the logs to custom log files, and can also split the logs according to file size.

Supervisor has two main components:

  1. When running Supervisor, a process named supervisord is started, which is responsible for starting the managed processes and starting the managed processes as its subprocesses, and can automatically restart the managed processes if they crash.
  2. supervisorctl is a command-line management tool that can be used to execute stop, start, restart, and other commands to manage these subprocesses.

Install

sudo pip install supervisor

Create the configuration file

echo_supervisord_conf > /etc/supervisord.conf

If you encounter a permission issue, you can use this command

sudo su - root -c "echo_supervisord_conf > /etc/supervisord.conf"

Description of the configuration file

To understand how to configure the processes to be managed, just open supervisord.conf, which contains very detailed comment information.

Open the configuration file

vim /etc/supervisord.conf

The default configuration file is like this, but there is a pit to be aware of, that is, supervisord.pid and supervisor.sock are placed in the /tmp directory, but /tmp directory is used to store temporary files, and the files inside it will be deleted by the Linux system. Once these files are lost, you can no longer execute the restart and stop commands through supervisorctl, and you will only get the error that unix:///tmp/supervisor.sock does not exist.

[unix_http_server]
;file=/tmp/supervisor.sock  ; (the path to the socket file)
; modifica in directory /var/run, per evitare che venga cancellato dal sistema
file=/var/run/supervisor.sock  ; (the path to the socket file)
;chmod=0700         ; socket file mode (default 0700)
;chown=nobody:nogroup    ; proprietario uid:gid del file socket
;username=user       ; (predefinito è nessun nome utente (server aperto))
;password=123        ; (predefinito è nessuna password (server aperto))
;[inet_http_server]     ; il server inet (TCP) è disabilitato per default
;port=127.0.0.1:9001    ; (specificatore ip_address:port, *:port per tutte le interfaccie)
;username=user       ; (predefinito è nessun nome utente (server aperto))
;password=123        ; (predefinito è nessuna password (server aperto))
...
[supervisord]
;logfile=/tmp/supervisord.log ; (file di log principale;predefinito $CWD/supervisord.log)
; modifica in directory /var/log, per evitare che venga cancellato dal sistema
logfile=/var/log/supervisor/supervisord.log ; (file di log principale;predefinito $CWD/supervisord.log)
logfile_maxbytes=50MB    ; (byte massimi del file di log principale prima della rotazione;predefinito 50MB)
logfile_backups=10      ; (numero di copie di backup del file di log principale;predefinito 10)
loglevel=info        ; (livello di log;predefinito info; altri: debug,warn,trace)
;pidfile=/tmp/supervisord.pid ; (file pid di supervisord;predefinito supervisord.pid)
; modifica in directory /var/run, per evitare che venga cancellato dal sistema
pidfile=/var/run/supervisord.pid ; (file pid di supervisord;predefinito supervisord.pid)
...
;imposta l'utente di avvio di supervisord, di solito non è consigliabile avviare con l'utente root, a meno che non sia assolutamente necessario
;user=chrism         ; (predefinito è l'utente corrente, richiesto se root)
...
[supervisorctl]
; deve corrispondere alla configurazione di 'unix_http_server'
;serverurl=unix:///tmp/supervisor.sock ; usa un URL unix:// per un socket unix
; modifica in directory /var/run, per evitare che venga cancellato dal sistema
serverurl=unix:///var/run/supervisor.sock ; usa un URL unix:// per un socket unix
;serverurl=http://127.0.0.1:9001 ; utilizza un url http:// per specificare un socket inet
;username=chris       ; dovrebbe essere la stessa di http_username se impostato
;password=123        ; dovrebbe essere la stessa di http_password se impostato
...

Di default, i file di log dei processi vengono spezzati quando raggiungono 50MB, conservando al massimo 10 file, naturalmente queste configurazioni possono essere configurate singolarmente per ogni processo.

Problemi di permessi

Dopo aver configurato il file di configurazione, è necessario creare le cartelle aggiunte nel file di configurazione. Se è stato specificato l'utente di avvio user, ad esempio oxygen, è necessario prestare attenzione ai problemi di permessi dei file pertinenti, inclusi i file di log, altrimenti possono verificarsi errori di permesso. Ad esempio, se è stato impostato l'utente di avvio oxygen e viene avviato supervisord, può verificarsi un errore

Errore: Impossibile aprire un server HTTP: socket.error segnalato errno.EACCES (13)

Il motivo è che la cartella /var/run nel file di configurazione non ha i permessi di scrittura per l'utente oxygen che avvia supervisord. La cartella /var/run è un link al /run, quindi dobbiamo modificare i permessi del /run.

sudo chmod 777 /run

Questo è un po' semplice e brusco, ma si potrebbe anche considerare di spostare i file .sock, .pid e altri dalla configurazione del file di configurazione in una cartella diversa e assicurarsi di avere i permessi necessari. Di solito, possiamo avviare il processo supervisord con l'utente root e specificare l'utente con cui avviare i processi che gestisce.

Gestione tramite browser

Supervisor offre anche la possibilità di gestire i processi tramite browser, è sufficiente commentare alcune righe.

;[inet_http_server]     ; il server inet (TCP) è disabilitato per default
;port=127.0.0.1:9001    ; (specificatore ip_address:port, *:port per tutte le interfaccie)
;username=user       ; (predefinito è nessun nome utente (server aperto))
;password=123        ; (predefinito è nessuna password (server aperto))
[supervisorctl]
...
;serverurl=http://127.0.0.1:9001 ; utilizza un url http:// per specificare un socket inet
;username=chris       ; dovrebbe essere la stessa di http_username se impostato
;password=123        ; dovrebbe essere la stessa di http_password se impostato

 

usare include

Alla fine del file di configurazione, c'è una voce di configurazione [include], come Nginx, può includere tutti i file di configurazione di una cartella specifica, cosi' possiamo scrivere la configurazione per ciascun processo o per alcuni processi correlati in un file separato.

[include]
files = /etc/supervisord.d/*.ini

esempio di configurazione del processo

Ecco un esempio semplice:

; impostare il nome del processo, necessario per gestire i processi con supervisorctl
[program:your_program_name] 
command=python server.py --port=9000
;numprocs=1         ; di default è 1
;process_name=%(program_name)s; di default è %(program_name)s, ossia x in [program:x]
directory=/home/python/tornado_server; prima di eseguire il command, passare alla directory di lavoro
user=oxygen         ; avvia il processo utilizzando l'utente oxygen
; il programma viene riavviato automaticamente in caso di crash, con un numero di riavvii limitato, di default 3 volte
autorestart=true      
redirect_stderr=true    ; reindirizza i log di output
stdout_logfile = /var/log/supervisord/tornado_server.log
loglevel=info

impostare il livello di log

loglevel specifica il livello di log, i messaggi di log prodotti dalle istruzioni print di Python non vengono registrati nei file di log, e devono essere combinati con il modulo logging di Python per produrre log con un livello specificato.

processi multipli

Secondo la definizione ufficiale, un [program:x] rappresenta effettivamente un gruppo di processi con caratteristiche o tipi simili, il che significa che un [program:x] puo' avviare più processi. I membri di questo gruppo di processi sono determinati dai parametri numprocs e process_name, cosi' che cosa significa questa frase? Vediamo questo esempio.

; impostare il nome del processo, necessario per gestire i processi con supervisorctl
[program:foo] 
; puo' essere utilizzato un'espressione python in questo command per passare parametri diversi a ciascun processo
command=python server.py --port=90%(process_num)02d
directory=/home/python/tornado_server; prima di eseguire il command, passare alla directory di lavoro
; Se numprocs non è uguale a 1, l'espressione di process_name deve includere process_num per distinguere i processi diversi
numprocs=2          
process_name=%(program_name)s_%(process_num)02d; 
user=oxygen         ; avvia il processo utilizzando l'utente oxygen
autorestart=true      ; riavvia automaticamente il programma in caso di crash
redirect_stderr=true    ; reindirizza i log di output
stdout_logfile = /var/log/supervisord/tornado_server.log
loglevel=info

Questo esempio avvierà due processi, process_name rispettivamente foo:foo_01 e foo:foo_02. Attraverso questo metodo, è possibile avviare un gruppo di processi molto simili utilizzando un'opzione [program:x].

Vengono presentati altri due parametri di configurazione stopasgroup e killasgroup

; Predefinito a false, se impostato a true, quando il processo riceve un segnale stop, invierà automaticamente il segnale al processo figlio. Se questa opzione è impostata a true, allora implicitamente killasgroup sarà true. Ad esempio, quando si utilizza Flask in modalità Debug, Flask non trasmetterà il segnale stop ai suoi processi figli, quindi è necessario impostare questa opzione.

stopasgroup=false       ; invia il segnale stop al processo UNIX 
; Predefinito a false, se impostato a true, quando il processo riceve un segnale kill, invierà automaticamente il segnale al processo figlio. Se questo programma utilizza python multiprocessing, sarà in grado di fermare automaticamente i suoi thread figli.
killasgroup=false       ; SIGKILL il gruppo di processi UNIX (predefinito false)

Esempi di configurazione più dettagliati possono essere consultati come segue, la documentazione ufficiale è qui

;[program:theprogramname]
;command=/bin/cat       ; il programma (uso relativo utilizza PATH, può accettare argomenti)
;process_name=%(program_name)s; espressione del nome del processo (predefinito %(program_name)s)
;numprocs=1; numero di copie di processi da avviare (predefinito 1)
;directory=/tmp; directory in cui andare prima di eseguire (predefinito senza directory)
;umask=022; umask per il processo (predefinito None)
;priority=999; priorità di avvio relativa (predefinito 999)
;autostart=true; avvia all'avvio di supervisord (predefinito: true)
;autorestart=unexpected; quando e se riavviare (predefinito: unexpected)
;startsecs=1; numero di secondi che il programma deve rimanere in esecuzione (predefinito 1)
;startretries=3; numero massimo di fallimenti di avvio seriali (predefinito 3)
;exitcodes=0,2; codici di uscita 'attesi' per il processo (predefinito 0,2)
;stopsignal=QUIT; segnale utilizzato per uccidere il processo (predefinito TERM)
;stopwaitsecs=10; numero massimo di secondi di attesa prima di SIGKILL (predefinito 10)
;stopasgroup=false; invia segnale di stop al gruppo di processo UNIX (predefinito false)
;killasgroup=false; SIGKILL il gruppo di processi UNIX (predefinito false)
;user=chrism; imposta setuid a questo account UNIX per eseguire il programma
;redirect_stderr=true; reindirizza stderr al stdout (predefinito false)
;stdout_logfile=/a/path; percorso del file di registro stdout, NONE per nessuno; predefinito AUTO
;stdout_logfile_maxbytes=1MB; numero massimo di byte del file di registro prima della rotazione (predefinito 50MB)
;stdout_logfile_backups=10; numero di backup del file di registro stdout (predefinito 10)
;stdout_capture_maxbytes=1MB; numero di byte in 'capturemode' (predefinito 0)
;stdout_events_enabled=false; emetti eventi su scritture stdout (predefinito false)
;stderr_logfile=/a/path; percorso del file di registro stderr, NONE per nessuno; predefinito AUTO
;stderr_logfile_maxbytes=1MB; numero massimo di byte del file di registro prima della rotazione (predefinito 50MB)
;stderr_logfile_backups=10; numero di backup del file di registro stderr (predefinito 10)
;stderr_capture_maxbytes=1MB; numero di byte in 'capturemode' (predefinito 0)
;stderr_events_enabled=false; emetti eventi su scritture stderr (predefinito false)
;environment=A="1",B="2"    ; aggiunte all'ambiente del processo (def no adds)
;serverurl=AUTO        ; sovrascrivi il calcolo serverurl (childutils)

Gestisci più processi in un gruppo

Supervisor offre anche un altro metodo di gestione dei gruppi di processi, attraverso il quale è possibile gestire un gruppo di processi utilizzando il comando supervisorctl. A differenza dei gruppi di processi [program:x], qui i processi sono singoli [program:x].

[group:thegroupname]
programs=progname1,progname2 ; ciascuno si riferisce a 'x' nelle definizioni [program:x]
priority=999         ; priorità di avvio relativa (predefinito 999)

Dopo aver aggiunto la configurazione sopra menzionata, i nomi dei processi progname1 e progname2 diventeranno thegroupname:progname1 e thegroupname:progname2. Da ora in poi, utilizzeremo questo nome per gestire i processi, non più il nome progname1.

Dopo aver aggiunto la configurazione sopra menzionata, i nomi dei processi progname1 e progname2 diventeranno thegroupname:progname1 e thegroupname:progname2. Da ora in poi, utilizzeremo questo nome per gestire i processi, non più il nome progname1. La descrizione dei comandi supervisorctl verrà fornita in seguito.

Avvia supervisord

Eseguendo il comando supervisord, verrà avviato il processo supervisord, e i processi configurati nel file di configurazione verranno avviati di conseguenza.

# Utilizza il file di configurazione predefinito /etc/supervisord.conf
supervisord
# Specifica chiaramente il file di configurazione
supervisord -c /etc/supervisord.conf
# Utilizza l'utente user per avviare supervisord
supervisord -u user

Per ulteriori parametri, consultareDocumentazione

Introduzione ai comandi supervisorctl

# Ferma un processo specifico, program_name è l'elemento x in [program:x]
supervisorctl stop program_name
# Avvia un processo
supervisorctl start program_name
# Riavvia un processo
supervisorctl restart program_name
# Termina tutti i processi che appartengono al gruppo groupworker (start, restart allo stesso modo)
supervisorctl stop groupworker:
# Termina il processo groupworker:name1 (start, restart allo stesso modo)
supervisorctl stop groupworker:name1
# Ferma tutti i processi, nota: start, restart, stop non caricheranno il file di configurazione più recente
supervisorctl stop all
# Carica il file di configurazione più recente, ferma i processi esistenti e avvia, gestisci tutti i processi secondo la nuova configurazione
supervisorctl reload
# Avvia il processo con la nuova configurazione o che è stato modificato, i processi non modificati non verranno riavviati
supervisorctl update

Attenzione: il processo fermato con stop non verrà riavviato automaticamente con reload o update. Puoi anche consultareEcco

Avvia automaticamente Supervisord all'accensione

Supervisord non viene installato come servizio per impostazione predefinita, è anche un processo. L'ufficio ha fornito uno script che può installare Supervisord come servizio, puoi consultare qui per vedere gli script di installazione per vari sistemi operativi, ma non posso eseguire lo script di Ubuntu fornito ufficialmente.

Permetti di consultare il metodo di installazione serverfault risposta.

Ad esempio, se sono su un sistema Ubuntu, posso installarlo così, qui ho scelto un altro script

Scarica lo script
sudo su - root -c "sudo curl https://gist.githubusercontent.com/howthebodyworks/176149/raw/d60b505a585dda836fadecca8f6b03884153196b/supervisord.sh > /etc/init.d/supervisord"
# Imposta lo script come eseguibile
sudo chmod +x /etc/init.d/supervisord
# Imposta per eseguire automaticamente all'accensione
sudo update-rc.d supervisord defaults
# Prova a vedere se funziona correttamente
service supervisord stop
service supervisord start

Attenzione: dopo aver scaricato lo script, è necessario verificare che sia conforme alla nostra configurazione, ad esempio il percorso predefinito del file di configurazione, il percorso del file pid, ecc. Se ci sono differenze, è necessario apportare alcune modifiche.

In realtà c'è un metodo più semplice, perché Linux esegue lo script /etc/rc.local all'avvio, quindi è sufficiente aggiungere il comando di esecuzione qui

# Aggiungi il seguente contenuto se è Ubuntu
/usr/local/bin/supervisord -c /etc/supervisord.conf
# Aggiungi il seguente contenuto se è Centos
/usr/bin/supervisord -c /etc/supervisord.conf

Il contenuto sopra richiede di essere aggiunto prima del comando exit, e poiché l'ambiente PATH non è stato inizializzato completamente durante l'esecuzione dello script rc.local, il comando deve utilizzare il percorso assoluto.

Prima di aggiungere, esegui il comando nel terminale per verificare se può essere eseguito correttamente, se non trovi supervisord, puoi utilizzare il comando seguente per trovarlo

sudo find / -name supervisord

Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, il diritto d'autore è di proprietà del proprietario originale, il contenuto è stato contribuito autonomamente dagli utenti di Internet e caricato autonomamente, il sito web non possiede il diritto di proprietà, non è stato editato manualmente e non assume alcuna responsabilità legale correlata. Se trovi contenuti sospetti di violazione del copyright, è possibile inviare una e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare, fornendo prove pertinenti. Una volta verificata, il sito web eliminerà immediatamente il contenuto sospetto di violazione del copyright.

Ti potrebbe interessare