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

Jo *_* Ko 13 python linux ubuntu nohup python-2.7

我有一个python脚本,practice_one.py我希望它在Ubuntu Linux中永远运行,并具有以下内容:

while True:
   #    Code
Run Code Online (Sandbox Code Playgroud)

我尝试了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 &

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

Ash*_*Ash 8

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

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

  2. 在代码中的某处我有pdb.set_trace()这是一个调试断点.

  3. 在代码中的某处,请求来自用户的输入,如raw_input("请输入内容:")

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

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

编辑

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


Fuj*_*Liu 5

我建议您最好使用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())
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

现在,使用python test.py它作为守护进程运行,您可以使用ps aux | grep test.py它来检查它.


zwe*_*wer 1

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

nohup python practice_one.py &>/dev/null
Run Code Online (Sandbox Code Playgroud)