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".