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



我有一个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 &

它曾经工作,但现在退出了。现在可能有什么问题?

我通常在三种情况下遇到这种情况:

  1. 当 while 循环中发生异常时。

  2. 在代码中的某个地方,我有 pdb.set_trace((,这是一个调试断点。

  3. 当在代码中的某个地方,请求用户的输入,如raw_input("请输入一些内容:"(

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

不要担心第一条消息,它只是通知您nohup正在工作。

编辑

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

我建议您最好使用 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 来检查它。

我同意 Ash 的观点,您在脚本中遇到了一些麻烦。

我已经测试了您的方案,我向您保证nohup不是问题所在

蟒蛇代码

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

诺胡普执行

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

因此,请尝试简化脚本操作,通过注释代码并进行测试,找出问题所在,直到找到罪魁祸首。

设置脚本的执行权限

chmod +x practice_one.py

尝试关闭所有文件描述符

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

第一个不是错误 - 它只是意味着nohup将捕获STDOUT并将其存储在nohup.out中。如果要将所有内容静音,请使用:

nohup python practice_one.py &>/dev/null

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

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

我建议改用 for 循环。

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

这是nohup的正常行为。要避免这种情况,请尝试:

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

最新更新