Python + Ubuntu Linux + erreur de sauvegarde: + Exit

J’ai un script python, practice_one.py , que je voudrais qu’il tourne indéfiniment sous Ubuntu Linux et qui comporte les éléments suivants:

 while True: # Code 

Et j’ai essayé nohup python practice_one.py & mais j’ai eu le message nohup: ignoring input and appending output to 'nohup.out' .

Ensuite, lorsque j’appuie sur la touche Entrée, les autres messages sortent: [1]+ Exit nohup python practice_one.py

Comment se fait-il que la sortie se fasse automatiquement? Que pourrais-je faire mal?

MODIFIER

Tentative: nohup python practice_one.py /dev/null &

Et obtenez [1] 61122 puis, lorsque j’appuie sur Entrée, j’ai [1]+ Exit nohup python practice_one.py /dev/null &

Ça marchait mais ça se termine maintenant. Quel pourrait être le problème maintenant?

Je fais généralement face à cela dans trois cas:

  1. Lorsqu’une exception dans la boucle while se produit.

  2. Lorsque quelque part dans le code j’ai pdb.set_trace () qui est un point d’arrêt de débogage.

  3. Lorsque quelque part dans le code, l’entrée de l’utilisateur est demandée comme dans raw_input (“Veuillez entrer quelque chose:”)

Vérifiez votre code pour exclure ces trois causes.

Ne vous inquiétez pas du premier message, il vous informe simplement que rien n’est en cours.

MODIFIER

  1. Avant de lancer le script avec nohup assurez-vous que le script fonctionne correctement (ce serait la première chose à faire).

Je suggère que vous feriez mieux d’utiliser double fork magic à double fork magic pour exécuter votre programme de longue durée en tant que démon au lieu de nohup . Il est facile de déboguer et votre programme n’a pas besoin d’outils externes tels que nohup .

daemon.py

 import sys import os # double fork magic def daemonize(): os.umask(0) try: pid = os.fork() except OSError: sys.exit(0) if pid > 0: sys.exit(0) os.setsid() try: pid = os.fork() except OSError: sys.exit(0) if pid > 0: os._exit(0) os.chdir('/') import resource # Resource usage information. maxfd = resource.getrlimit(resource.RLIMIT_NOFILE)[1] if (maxfd == resource.RLIM_INFINITY): maxfd = 1024 # Iterate through and close all file descriptors. for fd in range(0, maxfd): try: os.close(fd) except OSError: # ERROR, fd wasn't open to begin with (ignored) pass fd = os.open(os.devnull, os.O_RDWR) os.dup2(fd, sys.stdin.fileno()) os.dup2(fd, sys.stdout.fileno()) os.dup2(fd, sys.stderr.fileno()) 

test.py

 from daemon import daemonize import time def test(): while True: time.sleep(10) if __name__ == '__main__': daemonize() # you could comment this line before you make sure your program run as you expect test() 

Maintenant, en utilisant python test.py pour le faire fonctionner comme un démon et vous pouvez utiliser ps aux | grep test.py ps aux | grep test.py pour le vérifier.

Je suis d’accord avec Ash, vous rencontrez des problèmes dans votre script.

J’ai testé votre scénario et je vous assure que rien n’est le problème :

Code Python

 $ cat practice_one.py while True: print 'ok' 

Exécution Nohup

 m.ortiz.montealegre@CPX-XYR3G1DTHBU ~/python_excercises/nohup-python $ nohup python practice_one.py & [1] 10552 m.ortiz.montealegre@CPX-XYR3G1DTHBU ~/python_excercises/nohup-python $ nohup: ignoring input and appending output to 'nohup.out' m.ortiz.montealegre@CPX-XYR3G1DTHBU ~/python_excercises/nohup-python $ ps PID PPID PGID WINPID TTY UID STIME COMMAND 10552 15248 10552 9992 cons1 6758389 16:52:27 /usr/bin/python2.7 

Donc, essayez de simplifier vos opérations de script pour trouver lequel est le problème en commentant le code et testez jusqu’à ce que vous trouviez le coupable.

Définir une autorisation d’exécution sur le script

 chmod +x practice_one.py 

Essayez de fermer tous les descripteurs de fichiers

 nohup ./practice_one.py <&- 1>&- 2>&- & 

Le premier n’est pas une erreur – cela signifie simplement que nohup va capturer STDOUT et le stocker dans nohup.out. Si vous voulez tout désactiver, utilisez:

 nohup python practice_one.py &>/dev/null 

Dans le code, il devrait y avoir une pause. Ce que je veux dire par là est Vous devriez avoir un état de sortie même si vous n’allez pas l’atteindre. Dans l’état existant, vous pouvez spécifier que la boucle while devienne vraie.

Source: https://wiki.python.org/moin/WhileLoop

Je recommande d’utiliser plutôt une boucle for.

C’est un comportement normal de nohup. Pour éviter cela, essayez:

 nohup python my_script.py /dev/null &