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?

12
demandé sur Jo Ko 2017-05-20 01:53:00

7 réponses

j'ai l'habitude de faire face à cette trois cas:

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

  2. quand quelque part dans le code j'ai l'APB.set_trace () qui est un point de rupture du débogage.

  3. 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

  1. Avant de lancer le script nohup assurez-vous que le script fonctionne très bien (Ce serait en fait la première chose à essayer).
8
répondu Ash 2017-05-24 01:37:06

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.

5
répondu Fujiao Liu 2017-05-28 15:09:34

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.

3
répondu Miguel Ortiz 2017-06-29 20:00:50

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>&- &
2
répondu Diego Torres Milano 2017-06-29 05:44:27

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
1
répondu zwer 2017-05-19 23:02:30

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.

1
répondu Toby.B 2017-05-19 23:03:19

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

nohup python my_script.py </dev/null &>/dev/null &
-1
répondu Raghav salotra 2017-05-23 12:56:04