Ошибка Python + Ubuntu Linux + nohup: [1] + Выход

У меня есть python script, practice_one.py, что Id нравится ему работать вечно в Ubuntu Linux и имеет следующее:

while True:
   #    Code

И я попытался nohup python practice_one.py &, но получил сообщение nohup: ignoring input and appending output to ‘nohup.out’.

Затем, когда я нажимаю клавишу ввода, выводится другое сообщение: [1]+ Exit nohup python practice_one.py

Почему он просто выходит автоматически? Что я могу делать неправильно?

ИЗМЕНИТЬ

Покушение: nohup python practice_one.py </dev/null &>/dev/null &

И получите [1] 61122, затем, когда я нажимаю enter, я получил [1]+ Exit nohup python practice_one.py </dev/null &>/dev/null &

Он работал, но теперь выходит.. Что может быть проблемой сейчас?

Ответ 1

Я обычно сталкиваюсь с этим в случаях трех:

  • Когда возникает исключение в цикле while.

  • Когда-то в коде у меня есть pdb.set_trace(), который является точкой останова отладки.

  • Когда где-то в коде запрашивается запрос от пользователя, как в raw_input ( "Пожалуйста, введите что-то" )

Проверьте код, чтобы исключить эти три причины.

Не волнуйтесь о первом сообщении, он просто информирует вас о том, что nohup работает.

ИЗМЕНИТЬ

  1. Перед запуском script с nohup убедитесь, что сам script работает нормально (на самом деле это первое, что нужно попробовать).

Ответ 2

Я предлагаю вам использовать double fork magic для запуска вашей долгосрочной программы как демона вместо nohup. Его легко отлаживать, и для вашей программы не нужны внешние инструменты, такие как 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()

Теперь, используя python test.py, чтобы запустить его как демон, и вы можете использовать ps aux | grep test.py для его проверки.

Ответ 3

Я согласен с Ash, вы столкнулись с некоторыми проблемами в своем script.

Я протестировал ваш сценарий, и я уверяю вас, nohup не проблема:

Код Python

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

Выполнение nohup

[email protected] ~/python_excercises/nohup-python
$ nohup python practice_one.py &
[1] 10552

[email protected] ~/python_excercises/nohup-python
$ nohup: ignoring input and appending output to 'nohup.out'

[email protected] ~/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

Итак, попробуйте упростить операции script, чтобы выяснить, какая из них является проблемой, комментируя код и проверяя, пока не найдете виновника.

Ответ 4

Установите разрешение на выполнение для script

chmod +x practice_one.py

Попробуйте закрыть все дескрипторы файлов

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

Ответ 5

Первая из них не является ошибкой - это просто означает, что nohup захватит STDOUT и сохранит его в nohup.out. Если вы хотите отключить все, используйте:

nohup python practice_one.py &>/dev/null

Ответ 6

В коде должен быть разрыв. Что я имею в виду под этим; У вас должно быть состояние выхода, даже если вы не достигнете его. В существующем состоянии вы можете указать, чтобы цикл while стал истинным.

Источник: https://wiki.python.org/moin/WhileLoop

Я бы рекомендовал вместо этого использовать цикл for.

Ответ 7

Я только что встретил эту проблему. Мое решение после отправки nohup python my_script.py, не nohup python my_script.py Enter сразу. Скорее, дайте ему одну минуту, две или даже дольше. Затем, если вы нажмете Enter, никакой Exit больше не будет отображаться. И если jobs, вы увидите, что ваша работа работает в фоновом режиме.

Это определенно обходной путь, а не решение основной причины.

Ответ 8

Это нормальное поведение nohup. Чтобы избежать этой попытки:

nohup python my_script.py </dev/null &>/dev/null &