有没有办法为 运行 python 程序取消缓冲 nohup?
Is there a way to unbuffer nohup for a running python program?
我在服务器上启动了 运行 我的 python 程序:
nohup python program.py &
该程序包含一个循环,该循环运行一个函数并每次打印其输出:
for i in s:
print f(i)
我昨天启动了程序,但是我的nohup.out
还是空的。我在网上搜索了一下,似乎 python 缓冲了输出。我不想停止并重新运行我的程序。现在有什么方法可以将输出刷新到 nohup.out
吗?
不容易或不可靠。我可以描述一些 可能 有效的东西,但我从未在 Python 中测试过它,并且它有一些假设。
假设 Python 使用 libc stdio 缓冲区,您可以使用 gdb 附加到 运行 Python 解释器并使用 gdb 在 stdout 上调用 fflush。
请注意,这可能会使您的 运行 程序崩溃。
首先找到python程序的PID。
其次,使用GDB附加到它:gdb --pid [PID from first step]
三、在GDB中输入call fflush(stdout)
然后键入 detach
然后 q
退出 GDB。
无保证。
您可以使用 stdbuf
,无缓冲的 STDOUT:
stdbuf -o0 nohup python program.py &
行缓冲标准输出:
stdbuf -oL nohup python program.py &
或者更好地使用 -u
选项和 python
:
nohup python -u program.py &
或者在你的程序中使用sys.stdout.flush(()
刷新标准输出,使标准输出无缓冲。
我在服务器上启动了 运行 我的 python 程序:
nohup python program.py &
该程序包含一个循环,该循环运行一个函数并每次打印其输出:
for i in s:
print f(i)
我昨天启动了程序,但是我的nohup.out
还是空的。我在网上搜索了一下,似乎 python 缓冲了输出。我不想停止并重新运行我的程序。现在有什么方法可以将输出刷新到 nohup.out
吗?
不容易或不可靠。我可以描述一些 可能 有效的东西,但我从未在 Python 中测试过它,并且它有一些假设。
假设 Python 使用 libc stdio 缓冲区,您可以使用 gdb 附加到 运行 Python 解释器并使用 gdb 在 stdout 上调用 fflush。
请注意,这可能会使您的 运行 程序崩溃。
首先找到python程序的PID。
其次,使用GDB附加到它:gdb --pid [PID from first step]
三、在GDB中输入call fflush(stdout)
然后键入 detach
然后 q
退出 GDB。
无保证。
您可以使用 stdbuf
,无缓冲的 STDOUT:
stdbuf -o0 nohup python program.py &
行缓冲标准输出:
stdbuf -oL nohup python program.py &
或者更好地使用 -u
选项和 python
:
nohup python -u program.py &
或者在你的程序中使用sys.stdout.flush(()
刷新标准输出,使标准输出无缓冲。