Gerenciar processos em segundo plano de forma confiável é crucial para a estabilidade de qualquer aplicação. O Supervisor surge como uma solução robusta para garantir que seus processos estejam sempre ativos e acessíveis.
Por Que Utilizar o Supervisor?
Imagine um cenário onde um script crítico para o seu negócio, como um processador de pagamentos, falha inesperadamente enquanto você está indisponível. Nesses momentos, uma ferramenta de supervisão de processos atua como um guardião incansável. O Supervisor, escrito em Python, transforma processos comuns em serviços resilientes e autogerenciáveis.
Comparado a métodos tradicionais como nohup ou systemd, o Supervisor oferece vantagens significativas:
- Reinicialização Automática: Se um processo falhar, o Supervisor o reinicia automaticamente, garantindo a continuidade do serviço.
- Gerenciamento Centralizado: Permite monitorar e controlar múltiplos processos a partir de uma única interface, simplificando a administração.
- Monitoramento de Status e Logs: Fornece visibilidade em tempo real sobre o estado dos processos e seus logs, agilizando a identificação e resolução de problemas.
Experiências passadas com falhas de processos em produção destacam a importância de tais ferramentas. Incidentes, como a falha de um script de sincronização de estoque durante um período de alta demanda, podem levar a perdas significativas se não forem detectados e corrigidos rapidamente.
Configuração Inicial do Supervisor
Instalação
Em sistemas baseados em Debian/Ubuntu, a instalação é direta:
sudo apt update
sudo apt install -y supervisor
Para outras distribuições ou para garantir a versão mais recente, o uso do pip é recomendado:
pip install supervisor
Em ambientes Docker, integre o Supervisor diretamente na imagem base:
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y supervisor \
&& mkdir -p /var/log/supervisor \
&& mkdir -p /etc/supervisor/conf.d
COPY supervisord.conf /etc/supervisor/supervisord.conf
CMD ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisor/supervisord.conf"]
Estrutura do Arquivo de Configuração
O arquivo principal de configuração do Supervisor geralmente se encontra em /etc/supervisor/supervisord.conf. É uma boa prática gerar um arquivo de configuração padrão e personalizá-lo:
echo_supervisord_conf > /etc/supervisor/supervisord.conf
A configuração é dividida em seções:
- [unix_http_server]: Configura o socket para comunicação com o Supervisor.
- [inet_http_server]: Define o servidor HTTP para acesso à interface web (ajuste a porta conforme necessário).
- [supervisord]: Parâmetros globais do processo Supervisor, como logs e PID.
- [include]: Diretório onde as configurações específicas dos programas serão colocadas.
Parâmetros comumente ajustados incluem:
[unix_http_server]
file=/var/run/supervisor.sock
chmod=0700
[inet_http_server]
port=0.0.0.0:9001
username=admin
password=your_strong_password
[supervisord]
logfile=/var/log/supervisor/supervisord.log
logfile_maxbytes=50MB
logfile_backups=10
[include]
files = /etc/supervisor/conf.d/*.conf
Gerenciando seu Primeiro Processo
Para supervisionar um simples servidor web Python, crie um arquivo de configuração em /etc/supervisor/conf.d/webapp.conf:
[program:webapp]
command=/usr/bin/python3 /opt/webapp/app.py
directory=/opt/webapp
user=www-data
autostart=true
autorestart=true
stderr_logfile=/var/log/webapp.err.log
stdout_logfile=/var/log/webapp.out.log
environment=PYTHONPATH="/opt/webapp"
Pontos importantes a serem observados:
- O comando especificado na diretiva
commanddeve executar o processo em primeiro plano (sem&ounohup). - Utilize um usuário com privilégios mínimos para executar a aplicação.
- Garanta que o diretório de logs exista e tenha permissões de escrita adequadas.
Após criar ou modificar a configuração, aplique as alterações:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl status
Comandos Essenciais do Supervisorctl
O utilitário supervisorctl é a ferramenta principal para interagir com o Superviosr:
Verificar o status de todos os processos gerenciados:
supervisorctl status
Iniciar, parar ou reiniciar um processo específico:
supervisorctl start webapp
supervisorctl stop webapp
supervisorctl restart webapp
Gerenciar todos os processos:
supervisorctl stop all
supervisorctl start all
Recarregar a configuração do Supervisor:
supervisorctl reload