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