假设我有一个 python 脚本script.py
from time import sleep
for i in range(3):
print(i)
sleep(1)
print('done')
我想通过 ssh 命令在远程服务器上运行,例如
ssh me@server "python script.py"
0 1 2 done
如果我逐字执行上述操作,我会在启动脚本三秒后获得整个输出。相反,我希望立即看到脚本生成的输出,即0
- 一秒后 - 1
- 一秒后 - 2
- 一秒后 - done
。
我见过关于查看日志文件的类似问题,但是有没有一种简单的方法可以做到这一点(例如,无需中间记录到服务器上的文件)?
答案1
当程序将输出发送到 uinx 中的 stdout 时,通常会缓冲输出以优化 I/O 性能。缓冲模式通常是根据程序运行的上下文来选择的。
当您在 UNIX 中启动交互式会话时,您的会话通常是行缓冲的,这意味着当程序输出换行符时,缓冲区将被刷新。
当程序在文件上下文(即 stdout 是一个文件)或有时在管道上下文中启动时,它们通常是块缓冲的,这意味着块在填满之前不会被写入(通常为 8192 字节)。
程序可以通过在需要时刷新标准输出或直接更改缓冲模式来内部更改此设置。不幸的是,Python对此的支持很差或者根本不存在。
您可以通过使用命令启动程序来从外部更改缓冲模式stdbuf
。
例如:
ssh me@server "stdbuf -oL python script.py"
应该做你想做的事,强制它进行行缓冲。