Executando verificação de segurança...
17

[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.

4
3

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.

1
1
1

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

0
1

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?

1

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.