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.