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?
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)
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.
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
@daemondef 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.
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
import yapdi
daemon = yapdi.Daemon()
retcode = daemon.daemonize()# This would run in daemon mode; output is not visibleif retcode == yapdi.OPERATION_SUCCESSFUL:print('Hello Daemon')
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?somecommand &
isso irá imprimir o pid como[1] 12345
. caso contrário, você pode usar$!
.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 planodisown %1
(assumindo que este seja o trabalho nº 1, usejobs
para determinar)fonte
Você também pode usar a tela GNU que quase todos os sistemas Linux / Unix deveriam ter.
Se você estiver no Ubuntu / Debian, sua variante aprimorada byobu também é bastante agradável.
fonte
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.
fonte
Você pode saber, mas eu prefiro a tela .
fonte
Aqui está uma solução simples dentro do python usando um decorador:
Você pode, é claro, substituir o conteúdo do seu
bgservice.py
arquivo no lugar demy_func
.fonte
O shell zsh tem a opção de fazer todos os processos em segundo plano rodarem com nohup.
Em
~/.zshrc
adicionar as linhas: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.
fonte
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
supervisorctl
que 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
fonte
Você também pode usar o Yapdi :
Uso básico:
fonte
Experimente isto:
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 .
fonte