Rodar processo em segundo plano no linux usando o supervisor
Neste tutorial vamos aprender a executar uma aplicação em segundo plano utilizando o supervisor.
Supervisor é um sistema que permite que seus usuários controlem vários processos em sistemas operacionais baseado em Unix. Desta forma portanto ele não funciona em Windows.
O Supervisor destina-se a funcionar no Python 3 versão 3.4 ou posterior e no Python 2 versão 2.7.
Para instalar o supervisor basta instalar com o comando:
sudo apt install supervisor
Isso irá instalar o supervisor e criar a estrutura de pastas necessária para fazer a configuração das aplicações.
Para manter uma aplicação em funcionamento devemos criar um arquivo de configuração, esse arquivo vai conter informações sobre diretório onde está a aplicação, comando à executar além de outras configurações.
O programa mais simples possível de se executar, mostrado como exemplo na documentação é o seguinte:
[program:foo]
command=/bin/cat
Para os exemplos de todas as configurações possíveis, acesse a documentação do supervisor.
Após, verificar as configurações possíveis, crie o seu arquivo. Vou deixar aqui um template que utilizo em minhas aplicações, o local onde deve ficar este arquivo de template é o diretório que o supervisorctl utiliza para executar tarefas em segundo plano. No meu ubuntu linux esse diretório é o: /etc/supervisor/conf.d
Dentro deste diretório deve-se criar um arquivo chamado prometheusdb.conf
Vou criar um arquivo para manter em execução em segundo plano o banco de dados prometheus. Para isso eu criei o seguinte template:
[program:prometheusdb]
directory=/caminho/para/executavel/binário/prometheusdb
command=/caminho/para/executavel/binário/prometheusdb/prometheus
autostart=true
autorestart=true
startretries=5
numprocs=1
startsecs=1
process_name=%(program_name)s_%(process_num)02d
stderr_logfile=/var/log/supervisor/%(program_name)s_stderr.log
stderr_logfile_maxbytes=100MB
stdout_logfile=/var/log/supervisor/%(program_name)s_stdout.log
stdout_logfile_maxbytes=100MB
Explicando o arquivo, directory
é o cwd e command
é o nome do binário.
autostart
é um parâmetro para iniciar a aplicação automaticamente quando o supervisor é iniciado.
autorestart
Especifica se o supervisord deve reiniciar automaticamente um processo se ele parar quando estiver no estado RUNNING. Se falso, o processo não será reiniciado automaticamente.
startretries
O número de tentativas de falhas em série que o supervisord tentará iniciar o programa antes de desistir e colocar o processo em estado FATAL.
numprocs
indica o número de instâncias deste programa forem declaradas em numprocs.
startsecs
O número total de segundos que o programa precisa para permanecer em execução após uma inicialização para considerar o início bem-sucedido.
Depois de montar o seu .conf
basta utilizar os comandos para gerenciar o supervisorctl e iniciar o processo em segundo plano.
Gerenciar supervisorctl
Para gerenciar as tarefas em segundo plano, serão necessários utilizar alguns comandos:
sudo supervisorctl update
sudo supervisorctl start prometheusdb
Após isso, para verificar o status do processo em execução, basta consultar o status, com o comando:
sudo supervisorctl status
O resultado desta execução é o seguinte:
prometheusdb:prometheusdb_00 RUNNING pid 754, uptime 2:50:08
Então é isso, para mais informações consulte a documentação.
Vantagens
A principal vantagem que eu vejo na execução do supervisor é que ele fica observando o processo em execução, e em caso de uma saída inesperada ele fica responsável por reiniciar a aplicação e mantém a aplicação em execução "para sempre".