Como executar um script Python em segundo plano mesmo depois de fazer logout do SSH?


110

Tenho script Python bgservice.pye quero que ele seja executado o tempo todo, porque faz parte do serviço da web que construo. Como posso fazê-lo funcionar continuamente mesmo depois de fazer logout do SSH?

Respostas:


213

Execute nohup python bgservice.py &para fazer com que o script ignore o sinal de desligamento e continue em execução. A saída será colocada nohup.out.

Idealmente, você executaria seu script com algo assim supervisepara que ele possa ser reiniciado se (quando) ele morrer.


15
quando executo o comando com nohup e &, recebo a mensagem nohup: ignoring in put and appending output to nohup.out'` e quando pressiono enter, o processo sai com o status 1. O que está acontecendo?
Santosh Ghimire

1
leia a saída em nohup.out. no meu caso, foi um problema de permissão, precisei usar sudo
mxns

e como interromper o bgservice após ser executado neste método?
incêndio no buraco de

1
@Shaegorath salve o pid em algum lugar para que você possa enviar sinais para o processo mais tarde. em alguns shells (bash, zsh, etc.) depois de fazer somecommand &isso irá imprimir o pid como [1] 12345. caso contrário, você pode usar $!.
Tony Beta Lambda

31

Se você já iniciou o processo e não deseja encerrá-lo e reiniciá-lo sob nohup, pode enviá-lo para segundo plano e, em seguida, rejeitá-lo.

Ctrl+Z (suspender o processo)

bg (reinicie o processo em segundo plano

disown %1(assumindo que este seja o trabalho nº 1, use jobspara determinar)



12

Você pode considerar transformar seu script python em um daemon python adequado, conforme descrito aqui .

python-daemon é uma boa ferramenta que pode ser usada para executar scripts Python como um processo daemon de segundo plano, em vez de um script em execução permanente. Você precisará modificar um pouco o código existente, mas é puro e simples.

Se você estiver enfrentando problemas com o python-daemon, há outro supervisor de utilitário que fará o mesmo por você, mas neste caso você não terá que escrever nenhum código (ou modificar o existente), pois esta é uma solução pronta para o daemonização processos.


dar uma breve explicação sobre como o problema pode ser resolvido geralmente é uma boa ideia.
Nikhil Sahu


5

Aqui está uma solução simples dentro do python usando um decorador:

import os, time

def daemon(func):
    def wrapper(*args, **kwargs):
        if os.fork(): return
        func(*args, **kwargs)
        os._exit(os.EX_OK)
    return wrapper

@daemon
def my_func(count=10):    
  for i in range(0,count):
     print('parent pid: %d' % os.getppid())
     time.sleep(1)


my_func(count=10)
#still in parent thread
time.sleep(2)
#after 2 seconds the function my_func lives on is own

Você pode, é claro, substituir o conteúdo do seu bgservice.pyarquivo no lugar de my_func.


1
Talvez seja necessário capturar o sinal SIGHUP. Em seguida, adicione signal.signal (signal.SIGHUP, handler) em seu bloco.
Chouettou

3

O shell zsh tem a opção de fazer todos os processos em segundo plano rodarem com nohup.

Em ~/.zshrcadicionar as linhas:

setopt nocheckjobs  #don't warn about bg processes on exit
setopt nohup        #don't kill bg processes on exit

Então você só precisa executar um processo como python bgservice.py &este:, e não precisa mais usar o comando nohup.

Não sei que muitas pessoas usam zsh, mas é um shell muito legal que eu recomendo.


1

Se o que você precisa é que o processo seja executado para sempre, não importa se você está logado ou não, considere a possibilidade de executar o processo como um daemon.

supervisord é uma ótima solução pronta para uso que pode ser usada para daemonizar qualquer processo. Ele tem outro utilitário de controle supervisorctlque pode ser usado para monitorar processos que estão sendo executados pelo supervisor.

Você não precisa escrever nenhum código extra ou modificar scripts existentes para fazer isso funcionar. Além disso, a documentação detalhada torna esse processo muito mais simples.

Depois de coçar minha cabeça por horas em torno do python-daemon, supervisor é a solução que funcionou para mim em minutos.

Espero que isso ajude alguém que está tentando fazer o daemon-python funcionar


1

Você também pode usar o Yapdi :

Uso básico:

import yapdi

daemon = yapdi.Daemon()
retcode = daemon.daemonize()

# This would run in daemon mode; output is not visible
if retcode == yapdi.OPERATION_SUCCESSFUL:
print('Hello Daemon')

1

Experimente isto:

nohup python -u <your file name>.py >> <your log file>.log &

Você pode executar o comando acima na tela e sair da tela.

Agora você pode seguir os registros do seu script Python: tail -f <your log file>.log

Para matar seu script, você pode usar os comandos ps -aux e kill .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.