Home Como manter um processo rodando para sempre
Post
Cancelar

Como manter um processo rodando para sempre

Bots não dormem. Bots não dão problema. Mas se algo acontecer, que reiniciem automaticamente. 😂

Systemctl

O comando systemctl é o gerenciador do systemd, que gerencia o Linux. É uma ferramenta essencial para administração de servidores Linux e permite total controle sobre os serviços em execução no sistema. O systemctl pode ser usado para controlar um serviço pelos comandos status, start, stop e restart.

Um serviço do sistema operacional pode ser usado para manter bots no ar ou para qualquer outra coisa que seja executada sempre ou em intervalos bem definidos. O RastreioBot, por exemplo, possui dois serviços.

1. O bot que fala com as pessoas

Existe um serviço principal que é responsável por responder as pessoas, coletar os códigos de pacotes enviados e também responder a comandos, como /start, /gif etc. Este serviço não procura por atualizações nos pacotes. Ele apenas consulta o banco de dados. Não há qualquer consulta ao sistema dos Correios neste serviço.

2. A rotina que verifica os pacotes

O segundo serviço é a rotina que verifica os pacotes, que faz a comunicação com os Correios. Esta rotina é executada usando-se um serviço do sistema operacional e é executada em intervalos definidos. Isto é, espera-se o tempo escolhido(RestartSec) antes de executar a rotina novamente. A vantagem desta abordagem em relação ao uso de um cronjob é que evita que uma rotina seja iniciada em paralelo à anterior caso ela não tenha terminado. Ou seja, não importa a duração de tempo para que o arquivo python seja executado. O tempo entre as rotinas é sempre o mesmo e não há execuções em paralelo.

Criar um serviço

Crie um arquivo chamado <nome do serviço>.service na pasta /lib/systemd/system com o conteúdo abaixo:

1
2
# cd /lib/systemd/system
# nano <nome do serviço>.service
1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=<DESCRIÇÃO>
After=multi-user.target

[Service]
Type=simple
WorkingDirectory=<DIRETÓRIO>
ExecStart=<COMANDO>
Restart=always
RestartSec=<INTERVALO>

[Install]
WantedBy=multi-user.target

Defina os valores conforme sua preferência.

  • Description: Descrição do serviço;
  • After: Em que momento o serviço será iniciado;
  • Type: Tipo de serviço;
  • WorkingDirectory: Diretório do serviço;
  • ExecStart: Comando para iniciar o serviço;
  • Restart: Quando reiniciar o serviço;
  • RestartSec: Tempo de espera em segundos entre as tentativas de reiniciar o serviço;
  • WantedBy: Determina em quais condições o serviço será iniciado caso habilitado para iníciar automaticamente.

Exemplo de arquivo preenchido:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=RastreioBot
After=multi-user.target

[Service]
Type=simple
WorkingDirectory=/usr/local/bin/RastreioBot
ExecStart=/usr/bin/python3 /usr/local/bin/RastreioBot/rastreiobot.py
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

Serviço de nome RastreioBot, localizado na pasta /usr/local/bin/RastreioBot/, e que deve ser reiniciado em 10 segundos caso pare por algum motivo.

Carregar alterações

Reinicie o serviço do systemd sempre que um arquivo .service for alterado.

1
# systemctl daemon-reload

Habilitar início automático

É necessário habilitar um serviço para que ele seja iniciado junto do sistema operacional. Ou seja, para que o serviço seja iniciado caso o servidor seja reiniciado.

1
# systemctl enable <nome do serviço>.service

Iniciar serviço

1
# systemctl start <nome do serviço>.service

Parar um serviço

1
# systemctl stop <nome do serviço>.service

Reiniciar um serviço

1
# systemctl restart <nome do serviço>.service

Verificar o status

1
# systemctl status <nome do serviço>.service

Verificar logs

1
# journalctl -u <nome do serviço>.service
Esta postagem está licenciada sob CC BY 4.0 pelo autor.