Monitorando Processos com Supervisord

Conheça o Supervisord, um software que permite você monitorar e gerenciar processos em servidores de forma simples e eficiente

Quem trabalha com servidores sabe que cedo ou tarde terá que criar um script que rode em background e que não pare de ser executado em caso de falha ou reinicialização do servidor. Esse tipo de script é comum em gerenciamento de servidores web ou rotinas de backup automatizadas. As vezes processos do Apache, Nginx ou MySQL precisam ser monitorados constantemente para garantir que, em caso de falha, voltem a funcionar automaticamente.

Esse tipo de necessidade pode ser solucionado de várias formas, Upstart, systemd ou simplesmente usando o Supervisord. Nesse artigo vou abordar a forma mais simples que encontrei de rodar scripts em background no Linux e garantir que eles continuem funcionando mesmo após a reinicialização ou falha na execução.

Gerenciar processos no Linux

Vamos imaginar a seguinte situação, bastante comum por sinal. Você possui uma droplet na DigitalOcean que roda um determinado site qualquer, você deseja que um determinado script consulte uma API constantemente. Uma solução seria criar uma entrada no crontab para que de tempos em tempos um arquivo PHP seja executado e a API consumida.

Mas o crontab só executa de tempos múltiplos de um minuto. O que fazer se você deseja que a API seja consultada a cada 5 segundos? Uma solução seria criar um script em PHP que realize a tarefa que você deseja e deixar o Supervisord cuidar do resto.

Nesse exemplo vamos criar um código em PHP que consulta uma API fictícia passando via GET alguns dados, e em seguida espera 5 segundos antes de finalizar sua execução. Como o Supervisord mantem sempre o processo rodando, quando meu script terminar a execução, o programa vai entender que ele parou de ser executado e vai reiniciar o processo. Obviamente isso leva alguns segundos, mas a título de exemplo, vamos supor que o código abaixo sempre será executado a cada 5 segundos.

<?php

$curl = curl_init();
curl_setopt_array($curl, array(
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL => 'http://testcURL.com/?item1=value&item2=value2',
    CURLOPT_USERAGENT => 'Codular Sample cURL Request'
));

$resp = curl_exec($curl);

curl_close($curl);
sleep(5);
?>

O código acima será colocada em /home/webserver.php e será usado durante nossos testes do Supervisord

Instalando o Supervisord

A instalação do Supervisord é semelhante a qualquer outro programa em sua droplet, basta digitar o comando abaixo para realizar a instalação.

sudo apt-get install -y supervisor

Após instalar o Supervisord você pode iniciar o serviço do mesmo com o seguinte comando.

sudo service supervisor start

É importante lembrar que o programa em questão é totalmente personalizável. Para realizar o gerenciamento de um determinado processo, basta criar um arquivo .conf com as configurações básicas para que o Supervisord saiba como lidar com o processo que você deseja monitorar.

Seguindo o padrão Linux, todas as configurações do software se encontram na pasta /etc/supervisord/ e seu arquivo de configuração base encontra-se em /etc/supervisord/supervisord.conf ao editar o arquivo para visulizar seu conteúdo, nota-se a seguinte linha.

[include]
files = /etc/supervisor/conf.d/*.conf

No código acima, pode-se observar que todo conteúdo da pasta /etc/supervisor/conf.d/ é incluído por padrão pelo software, desta forma basta criarmos um arquivo .conf dentro de /etc/supervisor/conf.d/ para que o software já localize a nossa configuração e a inicie sem grandes problemas.

Agora que já sabemos onde criar nosso arquivo de configuração, vamos criá-lo de fato. Vamos criar um arquivo chamado webserver.conf dentro de /etc/supervisor/conf.d/ desta forma o caminho completo para nosso arquivo é /etc/supervisor/conf.d/webserver.conf. Dentro do arquivo criado vamos colar o seguinte conteúdo.

[program:webserver]
command=/usr/bin/php /home/webserver.php
directory=/home/
autostart=true
autorestart=true
startretries=3
stderr_logfile=/var/log/teste/webserver.err.log
stdout_logfile=/var/log/teste/webserver.out.log
user=www-data
environment=SECRET_PASSPHRASE='segredo 1',SECRET_TWO='segredo 2'

Explicando o que cada comando acima faz:

  • [program:webserver] - Aqui definimos o nome do comando
  • command - Aqui que definimos o comando para iniciar o nosso script
  • directory - Definimos o diretório para que o Supervisord iniciar, seria como se você desse um cd manual até esse diretório.
  • autostart - Ao definir como true o script será iniciado com o sistema
  • autorestart - Ao definir como true o programa será reiniciado em caso de falha
  • startretries - Define o número de vezes que o Supervisord deve tentar reiniciar o processo antes de desistir e dar como falho
  • stderr_logfile - Arquivo para log de erro
  • stdout_logfile - Arquivo para log da saída padrão
  • user - Usuário que o processo deve ser
  • environment - Definimos variáveis de ambiente para serem passadas aos processos

Lembre-se que no exemplo anterior definimos uma saída de log para erros e para a saída padrão, por esse motivo precisamos criar o diretório que escolhemos (caso não exista). Por padrão o Supervisord não cria diretórios, por isso você precisa fazer isso manualmente através do comando abaixo.

sudo mkdir /var/log/teste

Agora que aprendemos o que é o Supervisord e como configurá-lo, vamos aprender como usá-lo para controlar um processo. Primeiramente podemos ler as configurações do nosso Supervisord usando o comando supervisorctl. Caso você altere as configurações do arquivo .conf, basta executar os comandos abaixo para atualizar tudo.

supervisorctl reread
supervisorctl update

Após executar os comandos acima, seu script deverá estar funcionando. Basta executar o comando supervisorctl para obter a saída abaixo e confirmar que seu script está funcionando.

$ supervisorctl
nodehook               RUNNING    pid 444, uptime 0:02:45

Sempre que você desejar conferir o status de seu script, basta executar o comando supervisorctl que receberá a informação se eles se encontra sendo executado ou não no momento.

Se agora você deseja parar um processo que esteja sendo executado, basta executar o comando abaixo. Desta forma o processo será interrompido e sua execução pausada.

supervisorctl stop webserver

Caso deseje iniciar um processo basta executar o comando abaixo.

supervisorctl start webserver

Com essas informações você já é capaz de gerenciar um processo em servidores Linux sem grandes problemas. Qualquer dúvida estamos à disposição.

Cadastre-se na DigitalOcean com Descontos!

Cadatre-se hoje mesmo na DigitalOcean e ganhe um cupom de $10 para iniciar os testes na plataforma

Renato Tavares

Analista de Sistemas

Sou formado em Análise de Sistemas e trabalho com Linux e programação há 10 anos, sou especialista em servidores WEB e apaixonado pela ferramenta que a DigitalOcean construiu.