【问题标题】:Python + Ubuntu Linux + nohup error: [1]+ ExitPython + Ubuntu Linux + nohup 错误:[1]+ 退出
【发布时间】:2017-10-20 04:09:36
【问题描述】:

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

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

【问题讨论】:

  • 查看nohup.out 是否有任何错误消息。
  • 循环体中确实有任何代码,对吧?
  • 我将通过在脚本上添加一个 python shebang 来开始解决这个问题,例如#!/usr/bin/env python。接下来,我将运行这个bash 命令以确保该脚本对所有用户都是可执行的:chmod +x practice_one.py。接下来,我会在 shebang 之后但在其他任何内容之前添加一个简单的写入外部文件,例如with open("my_file.txt", "w") as file: file.write("OK"),然后我会尝试再次运行该文件并查看外部文件是否印有“ok”它。如果您尝试这一切,请在此步骤中回复我的结果,以便我可以尝试进一步提供帮助
  • 你能把你的脚本贴在某个地方吗?也许可以学到新东西。
  • 如果“它以前可以工作,但现在退出了..”,那么问题不可能出在驱动程序上。每个人都在那里做过:-)

标签: python linux python-2.7 ubuntu nohup


【解决方案1】:

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

nohup python practice_one.py &>/dev/null

【讨论】:

  • 一切都被静音了,但我如何检查它是否真的在运行?
  • 嗯,ps aux | grep python ?
  • 为什么像 4EAST 这样的字符串被识别为 4%EF%BF%EF%BF%BD 等。
  • 这取决于文本和 shell 编码、终端表示等。另外有点超出您原来问题的范围。
  • 当我运行命令查看是否正在运行 nohup 时,它应该在列表中显示什么?不要相信我看到任何nohup
【解决方案2】:

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

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

我建议改用 for 循环。

【讨论】:

    【解决方案3】:

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

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

    2. 当我在代码的某处有 pdb.set_trace() 时,它是一个调试断点。

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

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

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

    编辑

    1. 在使用 nohup 运行脚本之前,请确保脚本本身运行良好(这实际上是首先要尝试的)。

    【讨论】:

    • 这是“答案”,因为这个问题包含的细节太少,无法说明。我的赌注是#4.... :)
    【解决方案4】:

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

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

    【讨论】:

    • 不解决问题...(脚本退出的事实)
    【解决方案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())
    

    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 对其进行检查。

    【讨论】:

      【解决方案6】:

      设置脚本的执行权限

      chmod +x practice_one.py
      

      尝试关闭所有文件描述符

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

      【讨论】:

        【解决方案7】:

        我同意 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
        

        所以,试着简化你的脚本操作,通过注释代码并测试找出问题所在,直到找到罪魁祸首。

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            猜你喜欢
            • 2021-03-06
            • 2013-11-23
            • 2021-12-24
            • 1970-01-01
            • 2020-07-08
            • 1970-01-01
            • 1970-01-01
            • 2019-03-31
            • 2023-03-14
            相关资源
            最近更新 更多