Ошибка 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 работает.
ИЗМЕНИТЬ
- Перед запуском 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 &