Problema: Executando Scripts Python Após Desconexão SSH
A execução de scripts Python em um servidor remoto pode ser interrompida quando a conexão SSH é fechada. Esse problema impede que scripts de longa duração concluam suas tarefas. É necessário um método para manter os scripts Python em execução em segundo plano após sair de uma sessão SSH.
Solução: Usando o Comando nohup
O que é nohup?
O comando nohup, abreviação de "no hangup" (sem desconexão), é uma ferramenta que permite executar processos que continuam em execução após você sair de um shell. Ele impede que o sistema envie o sinal de desconexão (SIGHUP) para o processo em execução quando o terminal é fechado. Esse sinal geralmente encerra processos vinculados ao terminal fechado.
Implementando nohup com scripts Python
Para usar nohup com seu script Python:
- Abra seu terminal ou sessão SSH.
- Navegue até o diretório com seu script Python.
-
Execute este comando:
nohup python bgservice.py &
O e comercial (&) no final do comando indica ao sistema para executar o processo em segundo plano. Isso permite que você use o terminal para outras tarefas enquanto seu script é executado.
Dica: Verificar Processos em Execução
Para verificar se seu processo nohup está em execução, use o comando 'ps':
ps aux | grep python
Isso mostrará todos os processos Python em execução, incluindo seu comando nohup.
Gerenciando a saída com nohup
Por padrão, nohup envia a saída do comando para um arquivo chamado "nohup.out" no diretório atual. Se você quiser usar um arquivo de saída personalizado, pode modificar o comando assim:
nohup python bgservice.py > saida_personalizada.log 2>&1 &
Este comando envia tanto a saída padrão quanto os erros para o arquivo "saida_personalizada.log".
Métodos Alternativos para Execução em Segundo Plano
Screen: Um Multiplexador de Terminal
Screen é um multiplexador de terminal que permite executar várias sessões de terminal em uma única janela. Ele ajuda a manter os processos em execução após você se desconectar de uma sessão SSH.
Para usar o Screen com seu script Python:
-
Inicie uma nova sessão Screen:
screen -S meu_script_python
-
Execute seu script Python:
python bgservice.py
-
Desconecte-se da sessão Screen pressionando Ctrl+A, seguido de D.
Para reconectar à sessão mais tarde, use:
screen -r meu_script_python
Dica: Gerenciando Múltiplas Sessões Screen
Para gerenciar várias sessões Screen, use o comando screen -ls
para listar todas as sessões ativas. Isso permite ver quais sessões estão em execução e seus nomes, facilitando a alternância entre diferentes processos em segundo plano.
Tmux: Alternativa de Multiplexador de Terminal
Tmux é outro multiplexador de terminal semelhante ao Screen. Ele possui mais recursos e é frequentemente considerado mais fácil de usar.
Para usar o Tmux com seu script Python:
-
Inicie uma nova sessão Tmux:
tmux new -s meu_script_python
-
Execute seu script Python:
python bgservice.py
-
Desconecte-se da sessão Tmux pressionando Ctrl+B, seguido de D.
Para reconectar à sessão mais tarde, use:
tmux attach -t meu_script_python
Em comparação com o Screen, o Tmux oferece:
- Melhor gerenciamento de janelas
- Mais opções de personalização
- Configuração mais fácil da barra de status
Tanto o Screen quanto o Tmux são boas opções para manter scripts Python em execução em segundo plano. A escolha entre eles geralmente depende da preferência pessoal.
Ferramentas de Gerenciamento de Processos
Supervisor: Um Sistema de Controle de Processos
Supervisor é um sistema de controle de processos para sistemas operacionais semelhantes ao Unix. Ele gerencia scripts Python de longa duração. O Supervisor inicia, para e monitora processos, e pode reiniciá-los em caso de falha.
Benefícios de usar o Supervisor para scripts Python:
- Reinício automático em caso de falhas
- Gerenciamento de processos através de interface web ou linha de comando
- Registro da saída do processo
- Agrupamento de processos para gerenciamento
Configuração básica do Supervisor:
-
Instale o Supervisor:
sudo apt-get install supervisor
-
Crie um arquivo de configuração para seu script Python:
sudo nano /etc/supervisor/conf.d/bgservice.conf
-
Adicione o seguinte conteúdo ao arquivo:
[program:bgservice] command=python /caminho/para/bgservice.py directory=/caminho/para/diretorio/do/script autostart=true autorestart=true stderr_logfile=/var/log/bgservice.err.log stdout_logfile=/var/log/bgservice.out.log
-
Recarregue o Supervisor e inicie seu programa:
sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start bgservice
Dica: Configurando Variáveis de Ambiente
Para definir variáveis de ambiente para seu script Python no Supervisor, adicione a seguinte linha ao seu arquivo de configuração:
environment=VAR_AMB1="valor1",VAR_AMB2="valor2"
Isso permite passar opções de configuração para seu script sem modificar o código.
systemd: Gerenciador de Sistema e Serviços
systemd é um gerenciador de sistema e serviços para sistemas operacionais Linux. Ele gerencia scripts Python como serviços do sistema.
Usando systemd para gerenciamento de scripts Python:
-
Crie um arquivo de serviço:
sudo nano /etc/systemd/system/bgservice.service
-
Adicione o seguinte conteúdo:
[Unit] Description=Script Python de Serviço em Segundo Plano After=network.target [Service] ExecStart=/usr/bin/python3 /caminho/para/bgservice.py Restart=always User=seunomeusuario [Install] WantedBy=multi-user.target
-
Recarregue o systemd, habilite e inicie o serviço:
sudo systemctl daemon-reload sudo systemctl enable bgservice.service sudo systemctl start bgservice.service
Para gerenciar seu serviço systemd:
- Verificar status:
sudo systemctl status bgservice.service
- Parar serviço:
sudo systemctl stop bgservice.service
- Reiniciar serviço:
sudo systemctl restart bgservice.service
Supervisor e systemd oferecem soluções para gerenciar scripts Python de longa duração. O systemd é mais integrado aos sistemas Linux modernos, enquanto o Supervisor se concentra no gerenciamento de processos.