Respostas:
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 supervise
para que ele possa ser reiniciado se (quando) ele morrer.
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 plano
disown %1
(assumindo que este seja o trabalho nº 1, use jobs
para determinar)
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.
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.
Você pode saber, mas eu prefiro a tela .
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.py
arquivo no lugar de my_func
.
O shell zsh tem a opção de fazer todos os processos em segundo plano rodarem com nohup.
Em ~/.zshrc
adicionar 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.
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
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')
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 .
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?