Como executar um script Python em segundo plano após logout SSH?

Publicado 17 de outubro de 2024

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:

  1. Abra seu terminal ou sessão SSH.
  2. Navegue até o diretório com seu script Python.
  3. 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:

  1. Inicie uma nova sessão Screen:

    screen -S meu_script_python
  2. Execute seu script Python:

    python bgservice.py
  3. 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:

  1. Inicie uma nova sessão Tmux:

    tmux new -s meu_script_python
  2. Execute seu script Python:

    python bgservice.py
  3. 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:

  1. Instale o Supervisor:

    sudo apt-get install supervisor
  2. Crie um arquivo de configuração para seu script Python:

    sudo nano /etc/supervisor/conf.d/bgservice.conf
  3. 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
  4. 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:

  1. Crie um arquivo de serviço:

    sudo nano /etc/systemd/system/bgservice.service
  2. 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
  3. 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.