立即在多个 ssh 服务器上记录远程命令的输出

use*_*081 6 bash ssh io-redirection shell-script stdout

我编写了一个简单的 bash 脚本,将 ssh 连接到 3 个主机(2 个远程,1 个我自己的用于测试)并运行一个长时间运行的 gui 程序,该程序将文本输出到我想记录的终端。

#!/bin/bash
ssh -f -X user@remote1 '(python -u long_running_program.py &> ~/log1.txt)'
ssh -f -X user@remote2 '(python -u long_running_program.py &> ~/log2.txt)'
ssh -f -X user@localhost '(python -u long_running_program.py &> ~/log3.txt)'
multitail -s 3 ~/log*
Run Code Online (Sandbox Code Playgroud)

由上可知,ssh 是通过 f 参数调用的,以在后台运行并允许脚本继续执行。在远程服务器上,使用无缓冲开关调用 python 程序并将输出重定向到日志文件(请注意,远程和本地计算机的主目录都在网络安装驱动器上,因此使用 ~ 在所有其中)。

上述技术上可行,但是来自远程机器的 2 个日志 (log1,log2) 更新速度非常慢。文件更新可能需要 20 秒以上(无论您是否使用 multitail、vi 等查看文件),而本地日志文件 (log3) 更新是即时的。

为了确认这不应该发生,我可以手动 ssh 进入遥控器并运行程序,而无需将输出重定向到文件。正如预期的那样,输出会无延迟地连续流式传输。我还尝试了各种方法,例如尝试关闭缓冲和使用脚本/tee/etc 都无济于事。

有谁知道是什么原因造成的和/或如何解决它?

小智 0

我建议使用专门为执行多个并行 SSH 会话而设计的pssh,而不是同时运行多个串行 SSH 命令。

例如,

pssh -i -H user@remote1 -H user@remote2 -H user@localhost '(python -u long_running_program.py &> ~/log$PSSH_NODENUM.txt)'
Run Code Online (Sandbox Code Playgroud)