Per gestire i processori in Linux esistono sistemi di inizializzazione come systemd. Se avete bisogno di una soluzione più semplice, un programma che possa gestire i processi della vostra applicazione, sia sul sistema che in un contenitore Docker. Un programma del genere esiste: è supervisor. Si tratta di un gestore di processi open source scritto in Python, semplice dal punto di vista funzionale, che può essere utilizzato per eseguire tutte le copie di un processo necessarie e monitorarne lo stato. Di seguito vi mostreremo come installare e configurare Supervisor utilizzando Ubuntu 20.04 come esempio.
Il modo più semplice per ottenere il programma è installarlo dai repository ufficiali. Per farlo, è necessario eseguire il comando:
$ sudo apt install supervisor
Se si desidera che il programma venga eseguito sempre, è necessario aggiungerlo al proprio autoloader ed eseguirlo. Eseguire:
$ sudo systemctl enable supervisor --now
Successivamente, è possibile visualizzare lo stato utilizzando il comando:
$ sudo systemctl status supervisor
Il file di configurazione si trova in /etc/supervisor/supervisord.conf.
Qui si trovano anche le impostazioni di base. È meglio usare la directory /etc/supervisor/conf.d/
per configurare i processi in esecuzione .
Il file di configurazione principale può essere lasciato come predefinito. Vediamo come creare file di configurazione per i programmi. La sintassi di una sezione per un singolo processo è la seguente:
nome variabile valore
Per ogni processo è necessario passare tali variabili affinché si avvii automaticamente e si riprenda dopo un crash:
directory
- directory di lavoro;
command
- comando per avviare il processo; user
- utente, per conto del quale il processo verrà avviato;
autostart
- se il processo deve essere avviato automaticamente; autorestart
- se il processo deve essere riavviato;
Tuttavia, sono disponibili molte altre impostazioni, alcune delle quali saranno discusse in questo articolo:
priority
- prioritàdel
processo da avviare;
environment
- variabili d'ambiente da passare al processo;
stdout_logfile
- dove reindirizzare l'output stdout del processo;
stderr_logfile
- dove reindirizzare l'output stderr del processo; process_name
- nome del processo, con la possibilità di sostituire il numero di copia;
numprocs
- numero di copie del processo da avviare;
startretries
- numero di tentativi di avvio del programma;
redirect_stderr
- reindirizza l'output di errore del processo all'output del supervisore;
redirect_stdout
- reindirizza l'output del processo all'output del supervisore.Per una migliore comprensione e per un esempio, eseguiamo uno script PHP che rimarrà in background:
$ sudo vi /home/sergiy/program/process.php
<?php
echo "Started...";
while(true){
sleep(5);
}
È possibile creare un file di configurazione del supervisore separato per il processo. Si può inserire la configurazione alla fine del file di configurazione principale, ma è meglio non farlo. È meglio creare un file di configurazione separato per ogni programma in /etc/supervisor/conf.d/
con il nome *.conf. Ad esempio, per questo programma il file avrà questo aspetto:
$ sudo vi /etc/supervisor/conf.d/process.conf
[program:process]
directory=/home/sergiy/program/
command=/usr/bin/php process.php
user=sergiy
autostart=true
autorestart=true
È quindi necessario riavviare supervisor, operazione che può essere eseguita con systemctl:
$ sudo systemctl restart supervisor
Oppure con l'utilità supervisorctl
:
$ sudo supervisorctl reload
È anche possibile vedere lo stato dei processi configurati utilizzando il comando:
Se il processo è in stato di RUNNING, va tutto bene ed è stato avviato con successo. Ma in questo caso il processo è in esecuzione in una singola istanza e spesso è necessario eseguire più copie dello stesso processo. A questo scopo si possono usare i parametri process_name
e numprocs
. Il primo consente di modificare il nome del processo in modo che contenga il numero di copie, mentre il secondo consente di specificare quante copie devono essere eseguite.
La variabile process_name
contiene solitamente uno schema di formattazione di stringhe python che contiene il nome del programma e il numero del processo: %(nome_programma)s_%(numero_processo)02d
. Qui il nome della variabile è tra parentesi, seguito dal suo tipo. Per esempio, per eseguire lo stesso programma in quattro thread, il file di configurazione deve essere impostato in questa forma:
$ sudo vi /etc/supervisor/conf.d/process.conf
[program:process]
directory=/home/sergiy/program/
command=/usr/bin/php process.php
user=sergiy
autostart=true
autorestart=true
process_name=%(program_name)s_%(process_num)02d
numprocs=4
Ora dobbiamo ricaricare supervisorctl
di nuovo e 4 processi saranno in esecuzione:
$ sudo supervisorctl status
Allo stesso tempo è possibile salvare tutti i dati emessi dal programma nel file di log. A questo scopo si utilizzano i parametri stdout_logfile
e stderr_logfile
. Ad esempio, è possibile salvare il file di log della sua esecuzione direttamente nella cartella del programma.
$ sudo vi /etc/supervisor/conf.d/process.conf
[program:process]
directory=/home/sergiy/program/
command=/usr/bin/php process.php
user=sergiy
autostart=true
autorestart=true
process_name=%(program_name)s_%(process_num)02d
numprocs=4
stdout_logfile=/home/sergiy/program/process.log
stderr_logfile=/home/sergiy/program/process.log.error
Dopo il riavvio del servizio, i log appariranno nella cartella con il programma:
Allo stesso modo, se si vuole reindirizzare
l'output dei processi all'output standard del supervisore, si devono usare i parametri redirect_stderr
e redirect_stdout.
Se il programma ha bisogno di variabili d'ambiente, è possibile passarle con il parametro environment. Le variabili devono essere scritte con le virgole. Ad esempio:
$ environment=DISPLAY=":1",HOME="/root"
Dopo ogni modifica della configurazione, ricordarsi di riavviare supervisor per applicare le modifiche. L'utilità supervisorctl può essere usata per controllare i processi. Come si è già capito, per vedere l'elenco dei processi è necessario eseguire:
$ sudo supervisorctl status
Quindi, conoscendo il nome del processo, è possibile riavviarlo, ad esempio processo:processo_00
:
$ sudo supervisorctl restart process:process_00
Arresta:
$ sudo supervisorctl stop process:process_00
Oppure avviare:
$ sudo supervisorctl start process:process_00
In alternativa, è possibile connettersi al processo e vedere cosa emette in stdout/stderr
utilizzando il comando fg
:
$ sudo supervisorctl fg process:process_00
Abbiamo visto come si configura Supervisor
e come si usa il software di gestione dei processi.