Para gerir os processadores no Linux, existem sistemas de inicialização como o systemd. Se precisar de uma solução mais simples, um programa que possa gerir os processos da sua aplicação, quer no sistema quer num contentor Docker. Esse programa existe - é o supervisor. É um gerenciador de processos open-source funcionalmente simples escrito em Python, que pode ser usado para executar tantas cópias de um processo quanto necessário e monitorar seu estado. A seguir, mostraremos como instalar e configurar o Supervisor usando o Ubuntu 20.04 como exemplo.
A maneira mais fácil de obter o programa é instalá-lo a partir dos repositórios oficiais. Para isso, é necessário executar o comando:
$ sudo apt install supervisor
Se quiser que o programa seja executado a toda a hora, tem de o adicionar ao seu carregador automático e executá-lo. Executar:
$ sudo systemctl enable supervisor --now
De seguida, pode ver o estado utilizando o comando:
$ sudo systemctl status supervisor
O ficheiro de configuração está localizado em /etc/supervisor/supervisord.conf.
É também aqui que se encontram as definições básicas. É melhor usar o diretório /etc/supervisor/conf.d/
para configurar os processos em execução .
O ficheiro de configuração principal pode ser deixado por defeito. Vamos ver como criar ficheiros de configuração para programas. A sintaxe de uma secção para um único processo é a seguinte:
nome da variável valor
Para cada processo é necessário passar estas variáveis para que este se inicie e recupere automaticamente após uma falha:
diretório
- diretório de trabalho;
comando
- comando para iniciar o processo; utilizador
- utilizador, em nome do qual o processo será iniciado;
autostart
- se o processo deve ser iniciado automaticamente; autorestart
- se o processo deve ser reiniciado;
No entanto, existem muitas mais definições disponíveis, aqui estão algumas delas que serão discutidas neste artigo:
prioridade
- prioridadedo
processo a ser iniciado;
environment
- variáveis de ambiente a serem passadas para o processo;
stdout_logfile
- para onde redirecionar a saída stdout do processo;
stderr_logfile
- para onde redirecionar a saída stderr do processo; process_name
- nome do processo, com a possibilidade de substituir o número da cópia;
numprocs
- número de cópias do processo a ser iniciado;
startretries
- número de tentativas para iniciar o programa;
redirect_stderr
- redirecciona a saída de erro do processo para a saída do supervisor;
redirect_stdout
- redirecciona a saída do processo para a saída do supervisor.Para melhor compreensão e exemplo, vamos executar um script PHP que ficará suspenso em segundo plano:
$ sudo vi /home/sergiy/program/process.php
<?php
echo "Started...";
while(true){
sleep(5);
}
É possível criar um arquivo de configuração do supervisor separado para o processo. É possível inserir a configuração bem no final do arquivo de configuração principal, mas é melhor não fazer isso. É melhor criar um ficheiro de configuração separado para cada programa em /etc/supervisor/conf.d/
com o nome *.conf. Por exemplo, para este programa este ficheiro terá o seguinte aspeto:
$ 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
Depois é necessário reiniciar o supervisor, o que pode ser feito com o systemctl:
$ sudo systemctl restart supervisor
ou com o utilitário supervisorctl
:
$ sudo supervisorctl reload
Também é possível ver o estado dos processos configurados usando o comando:
Se o processo estiver no estado RUNNING, está tudo bem e foi iniciado com sucesso. Mas, neste caso, o processo está a ser executado numa única instância e, muitas vezes, é necessário executar várias cópias do mesmo processo. Para este efeito, podemos utilizar os parâmetros process_name
e numprocs
. O primeiro permite-lhe modificar o nome do processo para conter o número da cópia, e o segundo permite-lhe especificar quantas cópias devem ser executadas.
A variável process_name
geralmente contém um padrão de formatação de string python que contém o nome do programa e o número do processo: %(program_name)s_%(process_num)02d
. Aqui o nome da variável está entre parênteses, seguido do seu tipo. Por exemplo, para executar o mesmo programa em quatro threads, o ficheiro de configuração deve ser definido desta 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
Agora temos que recarregar o supervisorctl
novamente e 4 processos estarão em execução:
$ sudo supervisorctl status
Ao mesmo tempo, é possível guardar todos os dados produzidos pelo programa no ficheiro de registo. Os parâmetros stdout_logfile
e stderr_logfile
são utilizados para este fim. Por exemplo, é possível enviar o ficheiro de registo da sua execução diretamente para a pasta com o programa.
$ 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
Depois de reiniciar o serviço, os registos aparecerão na pasta com o programa:
Da mesma forma, se quiser redirecionar
a saída dos seus processos para a saída padrão do supervisor, deve utilizar os parâmetros redirect_stderr
e redirect_stdout.
Se o seu programa precisar de quaisquer variáveis de ambiente, pode passá-las usando o parâmetro environment. As variáveis devem ser escritas com vírgulas. Por exemplo:
$ environment=DISPLAY=":1",HOME="/root"
Após cada alteração de configuração, lembre-se de reiniciar o supervisor para aplicar as alterações. O utilitário supervisorctl pode ser usado para controlar processos. Como já se apercebeu, para ver a lista de processos é necessário executar:
$ sudo supervisorctl status
Depois, sabendo o nome do processo, pode reiniciá-lo, por exemplo processo:processo_00
:
$ sudo supervisorctl restart process:process_00
Parar:
$ sudo supervisorctl stop process:process_00
Ou iniciar:
$ sudo supervisorctl start process:process_00
Em alternativa, pode ligar-se ao processo e ver o que este envia para stdout/stderr
utilizando o comando fg
:
$ sudo supervisorctl fg process:process_00
Vimos como o supervisor
é configurado e como utilizar o software de gestão de processos.