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