Python + Ubuntu Linux + nohup erreur: [1]+ Exit
j'ai un script python, practice_one.py
, que je voudrais qu'il à toujours courir dans Ubuntu Linux, et est la suivante:
while True:
# Code
Et j'ai essayé nohup python practice_one.py &
mais j'ai reçu le message nohup: ignoring input and appending output to ‘nohup.out’
.
puis quand j'appuie sur la touche Entrée, le message sort:[1]+ Exit nohup python practice_one.py
Comment se fait il s'interrompt automatiquement? Que pouvais-je fait de mal?
EDIT
Tentative de:
nohup python practice_one.py </dev/null &>/dev/null &
Et obtenir [1] 61122
puis quand je appuyez sur entrée, j'ai obtenu [1]+ Exit nohup python practice_one.py </dev/null &>/dev/null &
Ça marchait mais maintenant sorties.. Quel pourrait être le problème maintenant?
7 réponses
j'ai l'habitude de faire face à cette trois cas:
Lorsqu'une exception dans la boucle while se produit.
quand quelque part dans le code j'ai l'APB.set_trace () qui est un point de rupture du débogage.
Quand quelque part dans le code d'entrée de l'utilisateur est requise comme suit:raw_input("Veuillez entrer quelque chose: ")
Vérifiez votre code pour exclure ces trois causes.
Ne vous inquiétez pas pour le premier message, il s'agit simplement de vous informer que nohup est au travail.
EDIT
- Avant de lancer le script
nohup
assurez-vous que le script fonctionne très bien (Ce serait en fait la première chose à essayer).
je suggère que vous feriez mieux d'utiliser double fork magic
pour exécuter votre programme 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 comme 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
pour le vérifier.
je suis d'accord avec Ash, vous faites face à des problèmes dans votre script.
j'ai testé votre scénario et je vous assure nohup n'est pas le problème:
code Python
$ cat practice_one.py
while True:
print 'ok'
Nohup exécution
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 celui qui est le problème en commentant le code et tester jusqu'à trouver le coupable.
Définir la permission d'exécution sur le script
chmod +x practice_one.py
Essayez de fermer tous les descripteurs de fichier
nohup ./practice_one.py <&- 1>&- 2>&- &
La première n'est pas une erreur, il signifie simplement que nohup la capture à la sortie standard (STDOUT) et de le stocker dans nohup.hors. Si vous souhaitez désactiver le son de tout utiliser:
nohup python practice_one.py &>/dev/null
Dans le code, il devrait y avoir une pause. Ce que je veux dire par là, C'est que vous devriez avoir un État de sortie même si vous n'allez pas l'atteindre. Dans l'état exist, vous pouvez spécifier pour rendre la boucle while true.
Source:https://wiki.python.org/moin/WhileLoop
je recommande d'utiliser un pour boucle à la place.
C'est un comportement normal de nohup. Pour éviter cela, essayez:
nohup python my_script.py </dev/null &>/dev/null &