Por que meu script python não roda quando uso &

2

Eu tenho meu script gameServer.py rodando remotamente através do PuTTy.

gameServer.py tem esta aparência:

while True :
  (( listen for packets ))
  (( send all packets to all clients ))

QUANDO executo o script normalmente:

./gameServer.py

Funciona perfeitamente, mas o terminal está amarrado. Naturalmente sair do PuTTy termina meu script.

Eu quero ser capaz de fechar o PuTTY e ter esse script perpetuamente, então tentei:

./gameServer.py &

Mas isso realmente não funciona e eu não entendo o porquê. Primeiro de tudo, ele não está recebendo ou enviando nenhum pacote quando executado nesse modo & , em segundo lugar ele será "+ Interrompido" sempre que eu digito entrar ou QUALQUER COISA no console.

    
por bobobobo 05.10.2009 / 17:10

5 respostas

7

Não vejo por que seria parar, mas tente

nohup ./gameServer.py &

Isso deve fazer o gameServer.py ignorar o sinal de desconexão quando você desconecta o PuTTY

    
por 05.10.2009 / 17:20
3

Tente colocar em segundo plano com o comando: bg

user@rkt:~$ sleep 10
^z
[1]+  Stopped                 sleep 10
user@rkt:~$ bg
[1]+ sleep 10 &
user@rkt:~$ jobs
[1]+  Running                 sleep 10 &
    
por 05.10.2009 / 17:25
3

Você pode mudar seu processo para ser um daemon , então você pode detê-lo sem matá-lo:

def become_daemon():
  pid = os.fork ()
  if pid != 0: # if pid is not child...
    sys.exit(0)

  os.setsid() # Create new session and sets process group.
  pid = os.fork () # Will have INIT (pid 1) as parent process...
  if pid != 0: # if pid is not child...
    sys.exit(0)

e no seu script simples invoca esta função

Você pode ver esta receita do ActiveState para saber mais sobre o duplo-fork em> mecanismo e implementação mais precisa.

    
por 05.10.2009 / 18:27
2

Outra maneira de fazer logoff e deixar as tarefas em execução é com o comando " disown <jobid> ". Ele permite desvincular jobs da sessão de login atual, para que você possa fazer logoff.

    
por 05.10.2009 / 17:45
0

Isso não tem como objetivo responder ao seu problema python, não teria a menor idéia de por onde começar, mas uma solução temporária / utilidade útil é chamada screen yum install screen ou apt-get install screen se você estiver usando Debian / Ubuntu ou Redhat / Centos / Fedora irá instalá-lo. A tela fornece uma sessão de shell que você pode desanexar e reconectar sem ter que manter uma conexão. Eu praticamente uso em qualquer caixa que eu estou conectado porque se eu for desconectado eu não elimino o trabalho potencialmente prejudicial em seu fluxo.

apenas execute screen para gerar uma nova sessão, execute seu comando e pressione ctrl + ae depois d (mantenha o controle pressionado para ambas as letras) Para reconectar, execute screen -dr na linha de comando e sua sessão de tela se anexará à sua conexão atual.

    
por 05.10.2009 / 22:54