Gostaria de compartilhar um conhecimento que também vai servir para mim mesmo no futuro como uma espécie de bloco de notas.
Rodar um script em background serve para tarefas onde não é preciso de uma interação do usuário diretamente com o programa em si, como por exemplo:
Atualmente tenho utilizado esse sistema como hospedagem de um site feito com a biblioteca Flet utilizando Python, mas existem infinitas possibilidades de uso.
No meu caso, eu utilizo o Ubuntu Server 22.04.3 instalado em um Raspberry PI 3B, mas esse tutorial pode ser aplicado em qualquer distro que utiliza o systemd para gerenciar deamons. (Creditos para ikaikyy)
De preferência no diretório de seu usuário, crie um outro diretório com o nome do seu script.
~$ mkdir teste/
~$ cd teste/
Crie o arquivo requirements.txt
.
~/teste$ nano requirements.txt
Copie ou crie os arquivos do seu código nesse mesmo diretório, (para isso pode ser usado editores de texto no próprio terminal como o Nano
, ou no caso da transferencia de arquivos pode ser usado um acesso FTP
)
Escreva nele as bibliotecas necessárias para seu código rodar.
telethon>=1.31.1
Crie e ative o ambiente de desenvolvimento, instale as dependencias, e depois desative.
~/teste$ python -m venv .venv
~/teste$ source .venv/bin/activate
~/teste$ pip install -r requirements.txt
~/teste$ deactivate
Volte ao seu diretório root
e vá até o diretório etc/systemd/system/
.
~/teste$ cd ../../../
/$ cd etc/systemd/system/
Crie o arquivo de serviço com o nome que desejar como por exemplo {nome-do-arquivo}.service
.
/etc/systemd/system$ sudo nano teste.service
Escreva nesse arquivo o seguinte modelo:
Atenção, trocar os campos:
[Unit]
Description={Sua descrição}
After=network.target
[Service]
User={Seu usuário}
Group={Seu usuário}
WorkingDirectory=/home/{Seu usuário}/{Nome do diretório}
Environment="PATH=/home/{Seu usuário}/{Nome do diretório}/.venv/bin"
ExecStart=/home/{Seu usuário}/{Nome do diretório}/.venv/bin/python /home/{Seu usuário}/{Nome do diretório}/{Código principal}.py
[Install]
WantedBy=multi-user.target
Ative o serviço e checke o status
dele.
/etc/systemd/system$ systemctl deamon-reload
/etc/systemd/system$ sudo systemctl start teste
/etc/systemd/system$ sudo systemctl enable teste
/etc/systemd/system$ sudo systemctl status teste
Se você executou todos os passos até aqui corretamente, Parabéns 🥳, você tem um código que rodará até que o sistema seja desligado, ou por algum motivo o seu código finalizar.
Bom conteúdo, muito útil. Também utilizo um Raspberry Pi 3 como servidor.
Um parâmetro interessante que pode ser usado dentro de Service
é o Restart
eRestartSec
que garante que o serviço seja reiniciado em caso de falhas.
Aqui tem um link que fala sobre isso
https://freshman.tech/snippets/linux/auto-restart-systemd-service/
Só uma observação sobre a parte da distro, que você colocou como requisito mas na verdade não tem relação nenhuma a distro ser ou não baseada em debian, mas sim a distro utilizar systemd para gerenciar daemons, que caso você seja um usuário linux comum, é quase 100% de chance.
ok, muito obrigado, vou editar o post
Que massa mano, esse site so é acessivel na sua rede interna ou esta disponivel na web?
Sim, a não ser que eu faça um Port Forwarding nas configurações do meu roteador.
Mas como eu escrevi, o tutorial pode ser aplicado em qualquer sistema Linux que utilize o Systemd, como por exemplo uma VPS como da Amazon ou Oracle
Massa demais, entendi, valeu mano
geralmente utilizo o agendador de tarefas, crontab
, para executar rotinas. há algo de ruim nisso? ou melhor, qual a vantagem de criar um serviço ao invés de utilizar o agendador de tarefas?
Geralmente eu uso o systemd
para executar scripts que precisam ficar ativos o tempo todo, como é o caso de um servidor, pois consigo monitorar o status do serviço e programar para reiniciar automaticamente em caso de falha, também é possível parar o serviço manualmente de forma fácil.
O crontab
eu uso para rodar scripts que vão executar uma tarefa e depois disso não precisam ficar ativos, como por exemplo, um script que colete informações diariamente em determinado horário.