Come Controllare i Processi su Linux con Supervisord

Parliamo oggi di supervisord, un sistema di controllo dei processi. Questi sistemi hanno la funzione di garantire che altri processi siano costantemente attivi. Possono essere quindi elementi importanti per garantire l’affidabilità di un servizio soprattutto nei casi in cui il daemon da controllare è sviluppato in casa e da, quindi, molta meno affidabilità di un daemon con migliaia di istallazioni.

Il primo passo è, come sempre, istallare supervisord. Lo possiamo fare dal sito del progetto o utlizzando il sistema di pacchetti della propria distribuzione. Su Debian o Ubuntu:

aptitude install supervisor
Ad istallazione effettuata si avrà il demone supervisord e il tool di controllo supervisorctl. Inoltre il demone può essere configurato per rispondere a chiamate html (di default sulla porta 9001) sia per monitoraggio via browser sia per gestione tramite API xml-rpc.

Per prima cosa esaminiamo la configurazione di default che arriva con il pacchetto Ubuntu:

; supervisor config file

[unix_http_server]
file=/var/run/supervisor.sock ; (the path to the socket file)
chmod=0700 ; sockef file mode (default 0700)

[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
childlogdir=/var/log/supervisor ; (‘AUTO’ child log dir, default $TEMP)

; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket

; The [include] section can just contain the “files” setting. This
; setting can list multiple files (separated by whitespace or
; newlines). It can also contain wildcards. The filenames are
; interpreted as relative to this file. Included files *cannot*
; include files themselves.

[include]
files = /etc/supervisor/conf.d/*.conf
Come avviene in moltissimi casi i parametri di configurazione sono raggruppati in paragrafi.

[unix_http_server]: contiene i parametri necessari a definire il socket unix per le connessioni a supervisord.
[supervisord]: configurazione vera e propria del daemon; file di log, file di lock.
[rpcinterface:supervisor]: serve ad abilitare l’interfaccia rpc
[supervisorctl]: parametri passati usati al client; ad esempio come connettersi al server se non specificato altrimenti
[include]: un elenco di file da includere. Tipicamente uno per ogni tipo di daemon da controllare con le specifiche direttive.
Come prima cosa attiviamo l’interfaccia web abilitando un’utenza ed una password. Aggiungiamo o modifichiamo quindi il paragrafo inet_http_server con i seguenti valori:

[inet_http_server]
port = 127.0.0.1:9001
username = user
password = 123
e riavviamo il daemon

/etc/init.d/supervisord restart
Possiamo ora accedere all’interfaccia web connettendoci in localhost sulla porta 9001 ed inserendo i dati dell’account quando richiesti.

Creiamo ora uno script che utilizzeremo come daemon di test e configuriamo supervisord per gestirlo.

Editiamo quindi un file denominato test_supervisord.sh con il nostro editor di riferimento ed inseriamoci il seguente codice:

#!/bin/sh
while [ true ]; do
ls -lh /tmp/
rm /tmp/pippo
touch /tmp/pippo
sleep 5
done
cambiamo poi i permessi per renderlo eseguibile

chmod 700 test_supervisord.sh
Creiamo ora la configurazione su supervisord per dirgli di gestire questo daemon. Andremo ad inserire nel file /etc/supervisor/conf.d/test.conf il seguente contenuto

[program:test_supervisord]
command=/tmp/test_supervisord.sh
autostart=true
autorestart=true
stderr_logfile=/var/log/supervisor/test.err
stdout_logfile=/var/log/supervisor/test.log
dove, in un apposito paragrafo specifichiamo

[program:test_supervisord]: il nome del daemon da riportare sui vari report
command=/tmp/test_supervisord.sh: il comando da eseguire
autostart=true: se deve partire automaticamente all’avvio
autorestart=true: se deve essere riavviato in caso di interruzione
stderr_logfile=/var/log/supervisor/test.err: file di log in cui viene registrato l’output del daemon
stdout_logfile=/var/log/supervisor/test.log file di log in cui vengono riportato lo standard error del daemon
I parametri specificabili sono molti altri. Ad esempio

user: permette di specificare l’utente con cui il daemon viene eseguito
environment: accetta coppie chiave-valore che vengono trasformate in variabili di ambiente per l’esecuzione del daemon.
Per rendere attiva la nuova configurazione si può procedere con uno tra

kill -HUP “PID”
supervisorctl reread && supervisorctl update
o anche attraverso l’interfaccia web visto che l’abbiamo attivata.

supervisorctl rimane comunque l’interfaccia di eccellenza di questo sistema.

Al suo avvio presenta l’elenco dei demoni configurati ed il loro stato. Ed il comando help mostra cosa può essere fatto all’interno di questa command line.

root@nb:/etc/supervisor/conf.d# supervisorctl
test_supervisord RUNNING pid 8443, uptime 0:03:40
supervisor> help

default commands (type help ):
=====================================
add clear fg open quit remove restart start stop update
avail exit maintail pid reload reread shutdown status tail version

supervisor>
stop, start, restart e status serviranno ad esempio a gestire i vari daemon. reread e update li abbiamo già visti in azione. Quit permette di lasciare questa shell.