[DICA] - RODAR UM SCRIPT PYTHON EM BACKGROUND EM UM SISTEMA UBUNTU
Olá devs, tudo certo?
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:
- Serviço de Web Scraping.
- Bots de Discord.
- Bots de Telegram.
- Serviços assíncronos.
- etc...
Atualmente tenho utilizado esse sistema como hospedagem de um site feito com a biblioteca Flet utilizando Python, mas existem infinitas possibilidades de uso.
Setup do SO ⚙️
OBS:
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)
Requisitos:
- Distro linux que utiliza o systemd.
- Python 3 instalado.
- Algum editor de texto instalado (Nano, VI, etc)
Setup do VENV 📺
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
Setup do serviço ⚙️
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:
- {Sua descrição}
- {Seu usuário}
- {Nome do diretório}
- {Código principal}
[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
Conclusão 🏁
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.