【问题标题】:Is there a way to unbuffer nohup for a running python program?有没有办法为正在运行的 python 程序取消缓冲 nohup?
【发布时间】:2016-05-09 08:57:32
【问题描述】:

我开始在服务器上运行我的 python 程序:

nohup python program.py &

该程序包含一个循环,该循环运行一个函数并每次打印其输出:

for i in s:
    print f(i)

我昨天启动了程序,但我的nohup.out 仍然是空的。我搜索了互联网,似乎 python 缓冲了输出。我不想停止并重新运行我的程序。现在有没有办法将输出刷新到nohup.out

【问题讨论】:

  • 我已经回答了,但这并不是一个真正的编程问题,我认为更像是一个 Unix 和 Linux 问题,所以我将对此投赞成票。
  • 我投票结束这个问题,因为我认为它属于 Unix 和 Linux,但没有迁移。

标签: python linux output buffer nohup


【解决方案1】:

你可以使用stdbuf,无缓冲的STDOUT:

stdbuf -o0 nohup python program.py &

行缓冲的 STDOUT:

stdbuf -oL nohup python program.py &

或者更好地使用-u选项和python

nohup python -u program.py &

或者在你的程序中使用sys.stdout.flush(()来刷新STDOUT,使STDOUT不被缓冲。

【讨论】:

    【解决方案2】:

    不容易或可靠。我可以描述一些可能有效的东西,但我从未在 Python 中测试过它,它有一些假设。

    假设 Python 正在使用 libc stdio 缓冲区,您也许可以使用 gdb 连接到正在运行的 Python 解释器,并使用 gdb 在 stdout 上调用 fflush。

    请注意,这可能会使您正在运行的程序崩溃。

    先找到python程序的PID。

    其次,使用GDB附加到它:gdb --pid [PID from first step]

    第三,在GDB类型call fflush(stdout)

    然后输入detachq 退出GDB。

    没有保证。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-07
      • 2016-11-15
      • 1970-01-01
      • 1970-01-01
      • 2019-07-11
      • 2023-03-08
      • 2017-02-02
      相关资源
      最近更新 更多