【问题标题】:Nohup is not writing log to output fileNohup 没有将日志写入输出文件
【发布时间】:2012-10-06 20:45:06
【问题描述】:

我正在使用以下命令在后台运行 python 脚本:

nohup ./cmd.py > cmd.log &

但似乎 nohup 没有向日志文件写入任何内容。 cmd.log 已创建,但始终为空。在 python 脚本中,我使用sys.stdout.write 而不是print 打印到标准输出。我做错什么了吗?

【问题讨论】:

  • 您使用的是nohup 的哪个变体? BSD 版本写入当前目录中名为nohup.out 的文件(如果当前目录不可写,则写入$HOME/nohup.out)。我看不到更改输出文件名的方法...
  • @wulong 仅当 stdout 是终端时。
  • 我也尝试了没有重定向的命令,它根本没有创建 nohup.out 文件。我不知道它是哪个变体,但如果有帮助的话,我在 SunOS 5.10 上。

标签: python nohup


【解决方案1】:

您似乎需要定期刷新标准输出(例如sys.stdout.flush())。在我的测试中,即使使用print,Python 也不会自动执行此操作,直到程序退出。

【讨论】:

  • python 以及其他基于 C 标准输入输出的程序在交互情况下使用行缓冲(stdout 连接到 tty)和重定向到文件时使用块缓冲。如果python -u 不起作用; nohup 可能已经引入了自己的缓冲。
  • @J.F.Sebastian 截至今天,nohup 不缓冲输出,python -u 工作正常。 (只是人们的更新)
  • @Pius: nohup is a POSIX utility 在不同的平台上可能会有不同的实现。顺便说一句,python3 I/O 不再基于 C stdio,但它具有类似的缓冲行为。
  • @jfs stderr 缓冲行为在 Python 3.9 中发生了变化,现在它始终是行缓冲的。见here
【解决方案2】:

您可以使用 -u 标志运行 Python 以避免输出缓冲:

nohup python -u ./cmd.py > cmd.log &

【讨论】:

  • 这样更好!非常感谢:)
  • @kommradHomer 我想这取决于您的程序在 stdout/stderr 上产生的输出量。
  • 像魅力一样工作。我也认为这比选择正确的答案更好。您能否将其标记为正确,以免混淆其他人?
  • 警告:它doesn't always work。我不知道为什么。你呢?
  • 这应该是公认的答案...做了我想要的。谢谢!
【解决方案3】:
export PYTHONUNBUFFERED=1
nohup ./cmd.py > cmd.log &

nohup python -u ./cmd.py > cmd.log &

https://docs.python.org/2/using/cmdline.html#cmdoption-u

【讨论】:

    【解决方案4】:
    • 使用-unohup 对我有用。使用-u 将强制stdoutstderr 流无缓冲。它不会影响标准输入。一切都将保存在“nohup.out”文件中。像这样-

      nohup python -u your_code.py &
      

      您也可以将其保存到您的目录中。这样——

      nohup python -u your_code.py > your_directory/nohup.out &
      
    • 另外,您可以使用PYTHONUNBUFFERED。如果将其设置为非空字符串,它将与-u 选项相同。在运行 python 代码之前使用下面的命令运行。

      export PYTHONUNBUFFERED=1
      

      export PYTHONUNBUFFERED=TRUE
      

    P.S.- 我会建议使用诸如 cron-job 之类的工具在后台运行并安排执行。

    【讨论】:

    • 与@vz0 的回答有什么不同?
    • @德清没有区别。
    【解决方案5】:

    Python 3.3 及更高版本有一个 print 参数,这是唯一对我有用的方法。

    print("number to train = " + str(num_train), flush=True)
    print("Using {} evaluation batches".format(num_evals), flush=True)
    

    【讨论】:

      【解决方案6】:

      我遇到了类似的问题,但与 Python 进程无关。我正在运行一个执行 nohup 的脚本,该脚本通过 cron 定期运行。

      我能够通过以下方式解决问题:

      1. 重定向标准输入、标准输出和标准错误
      2. 确保通过 nohup 调用的脚本没有在后台运行任何其他内容

      PS:我的脚本是用在 RHEL 上运行的 ksh 编写的

      【讨论】:

        【解决方案7】:

        我按以下方式运行我的脚本,完全没有问题:

        nohup python my_script.py &> my_script.out &
        

        与您的语法相比,您在输入后似乎只缺少一个“&”符号...

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-03-21
          • 1970-01-01
          • 2020-07-13
          • 1970-01-01
          • 2013-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多