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

Python+;Ubuntu Linux+;nohup错误:[1]+;出口,python,linux,python-2.7,ubuntu,nohup,Python,Linux,Python 2.7,Ubuntu,Nohup,我有一个python脚本,practice\u one.py,我希望它能在Ubuntu Linux中永远运行,并具有以下功能: while True: # Code 我尝试了nohup-python-practice\u-one.py&,但得到了消息nohup:忽略输入并将输出附加到“nohup.out” 然后,当我按enter键时,会输出另一条消息:[1]+Exit nohup python practice_one.py 为什么它只是自动退出?我可能做错了什么 编辑 尝试: n

我有一个python脚本,
practice\u one.py
,我希望它能在Ubuntu Linux中永远运行,并具有以下功能:

while True:
   #    Code
我尝试了
nohup-python-practice\u-one.py&
,但得到了消息
nohup:忽略输入并将输出附加到“nohup.out”

然后,当我按enter键时,会输出另一条消息:
[1]+Exit nohup python practice_one.py

为什么它只是自动退出?我可能做错了什么

编辑

尝试:
nohup python practice\u one.py/dev/null&

获取
[1]61122
然后当我按enter键时,我得到了
[1]+退出nohup python practice\u one.py/dev/null&


它过去可以工作,但现在退出了。。现在会出现什么问题?

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

nohup python practice_one.py &>/dev/null

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

资料来源:


我建议改为使用for循环

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

  • 当while循环中发生异常时

  • 当代码中有pdb.set_trace()时,它是一个调试断点

  • 当代码中的某个地方出现时,会像原始输入一样请求用户输入(“请输入内容:”)

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

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

    编辑

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

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

    nohup python my_script.py </dev/null &>/dev/null &
    
    nohup python my_script.py/dev/null&
    
    我建议您最好使用
    双叉魔法
    作为守护进程运行长时间运行的程序,而不是
    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
    检查它。

    设置脚本的执行权限

    chmod +x practice_one.py
    
    尝试关闭所有文件描述符

    nohup ./practice_one.py <&- 1>&-  2>&- &
    
    nohup./practice\u one.py&-2>&-&
    
    我同意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
    

    因此,请尝试简化脚本操作,通过注释代码和测试找出问题所在。

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

    所有内容都被静音,但我如何检查它是否正在运行?嗯,
    ps aux | grep python
    ?为什么像4EAST这样的字符串会被识别为4%EF%BF%EF%BF%BD等,这取决于文本和shell编码,terminal representation等。plus超出了您最初问题的范围。当我运行命令查看是否正在运行nohup时,它应该在列表上显示什么?不要相信我在
    nohup.out
    中看到任何错误消息的nohupLook。在循环体中确实有任何代码,对吗?我将通过在脚本上添加python shebang来开始解决这个问题,例如
    #/usr/bin/env python
    。接下来,我将运行这个
    bash
    命令,以确保脚本对所有用户都是可执行的:
    chmod+xpractice\u one.py
    。接下来,我将在shebang之后但在其他任何操作之前,向外部文件添加一个简单的写操作,例如,将open(“my_file.txt”,“w”)作为file:file.write(“OK”),然后我将尝试再次运行该文件,查看外部文件是否打印了“OK”。如果你尝试了这一切,回复我在这步与结果,这样我可以尝试帮助进一步你可以张贴你的脚本的地方?也许可以学习一些新的东西。如果“它过去可以工作,但现在退出了…”,那么问题不可能出在司机身上。每个人都做过这样的事:-)不要解决问题。。。(脚本退出的事实)这是“答案”,因为该问题包含的细节太少,不足以说明其他问题。我的赌注是#4……)