Python + Ubuntu Linux + nohup错误:[1] +退出

问题描述 投票:13回答:8

我有一个python脚本,practice_one.py,我希望它在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然后当我按下输入我得到[1]+ Exit nohup python practice_one.py </dev/null &>/dev/null &

它曾经工作但现在退出..现在可能是什么问题?

python linux python-2.7 ubuntu nohup
8个回答
8
投票

我通常在三种情况下面对这种情况:

  1. 当while循环中发生异常时。
  2. 在代码中的某处我有pdb.set_trace()这是一个调试断点。
  3. 在代码中的某处,请求来自用户的输入,如raw_input(“请输入内容:”)

检查您的代码以排除这三个原因。

不要担心第一条消息,它只是告诉你nohup在工作。

编辑

  1. 在使用nohup运行脚本之前,请确保脚本本身正常工作(这实际上是第一次尝试)。

5
投票

我建议你最好使用double fork magic来运行你的长期运行程序作为守护进程而不是nohup。它很容易调试,你的程序不需要像nohup这样的外部工具。

daemon.朋友

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.朋友

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,你在剧本中遇到了一些麻烦。

我已经测试了你的场景,我向你保证nohup不是问题所在:

Python代码

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

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

因此,尝试通过注释代码并测试直到找到罪魁祸首来简化脚本操作以找出哪个是问题。


2
投票

设置脚本的执行权限

chmod +x practice_one.py

尝试关闭所有文件描述符

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

1
投票

第一个不是错误 - 它只是意味着nohup将捕获STDOUT并将其存储在nohup.out中。如果你想静音一切使用:

nohup python practice_one.py &>/dev/null

1
投票

在代码中,应该有一个休息时间。我的意思是;你应该有退出状态,即使你不打算到达它。在存在状态中,您可以指定使while循环变为true。

资料来源:https://wiki.python.org/moin/WhileLoop

我建议改用for循环。


0
投票

我刚刚遇到这个问题。我很确定你的代码有问题。否则,不应该有退出消息。


-1
投票

这是nohup的正常行为。为了避免这种尝试:

nohup python my_script.py </dev/null &>/dev/null &
© www.soinside.com 2019 - 2024. All rights reserved.