2 votes

Pourquoi mon script Python ne continue-t-il pas à s'exécuter lorsque j'utilise &

Mon gameServer.py script est exécuté à distance via PuTTy.

gameServer.py ressemble à ceci :

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

QUAND j'exécute le script normalement :

./gameServer.py

Il fonctionne parfaitement mais le terminal est bloqué. Naturellement, le fait de quitter PuTTy met fin à mon script.

Je veux pouvoir fermer PuTTY et laisser ce script s'exécuter perpétuellement, alors j'ai essayé :

./gameServer.py &

Mais en réalité ne fonctionne pas et je ne comprends pas pourquoi. Tout d'abord, il ne reçoit ni n'envoie de paquets lorsqu'il est exécuté dans cette fenêtre. & Le mode de fonctionnement de l'application est le même que celui du mode de fonctionnement de l'application, et deuxièmement, il s'arrête à chaque fois que je tape Entrée ou N'IMPORTE QUOI dans la console.

7voto

Constantin Points 12185

Je ne vois pas pourquoi cela s'arrêterait, mais essayez

nohup ./gameServer.py &

Ceci devrait permettre à gameServer.py d'ignorer le signal d'interruption lorsque vous déconnectez PuTTY.

3voto

rkthkr Points 8463

Essayez de le mettre en arrière-plan avec la commande : bg

user@rkt:~$ sleep 10
^z
[1]+  Stopped                 sleep 10
user@rkt:~$ bg
[1]+ sleep 10 &
user@rkt:~$ jobs
[1]+  Running                 sleep 10 &

3voto

drAlberT Points 10812

Puede modifier votre processus pour qu'il devienne un démon Vous pouvez alors détacher votre tty sans qu'il soit tué :

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)

et dans votre script invoquez simplement cette fonction

Vous pouvez consulter ce document Recette ActiveState pour en savoir plus sur la double fourche et une mise en œuvre plus précise.

2voto

dogbane Points 934

Une autre façon de se déconnecter et de laisser les tâches en cours d'exécution est d'utiliser l'option " disown <jobid> Le commandement ". Elle vous permet de délier les travaux de la session de connexion en cours, afin que vous puissiez vous déconnecter.

0voto

MarioDS Points 289

Ceci n'a pas pour but de répondre à votre problème Python, je n'aurais aucune idée de par où commencer, mais une solution de contournement temporaire / un utilitaire utile s'appelle screen yum install screen o apt-get install screen si vous utilisez Debian/Ubuntu ou Redhat/Centos/Fedora l'installera. Screen vous fournit une session Shell dont vous pouvez vous détacher et vous rattacher sans avoir à maintenir une connexion. Je l'utilise pratiquement sur toutes les machines auxquelles je suis connecté, car si je suis déconnecté, je n'interromps pas un travail potentiellement dommageable en cours de route.

courir screen pour créer une nouvelle session, exécutez votre commande et appuyez sur ctrl+a puis sur d (maintenez la touche contrôle enfoncée pour les deux lettres). Pour vous reconnecter, exécutez screen -dr à partir de la ligne de commande et votre session d'écran s'attachera à votre connexion actuelle.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X