我有一个好奇:
我通过 SSH 连接运行一个 bash 脚本,该脚本有大量输出到 stdout。如果我在后台或前台运行该过程,性能会有所不同吗?
我感觉在后台运行可能会更快,即使我看到输出到 stdout,因为 bash 本身不依赖于 SSH 延迟。这有道理吗?
答案1
正如 sarnold 所指出的,在后台运行该过程不会产生明显的区别。我认为将输出重定向到文件将消除本地终端可能存在的瓶颈,从而提高速度。
无论如何,如果您仍然需要查看输出,请尝试为 ssh 添加以下选项:
ssh -c blowfish -C remotehost foo
其中 -C 将启用压缩,-c blowfish 将选择对 CPU 影响较小的密码算法
答案2
你问了两种情况,但我认为你需要第三种情况:
无背景:
ssh remotehost foo
背景:
ssh remotehost foo &
输出重定向:
ssh remotehost foo > bar
没有背景和有背景都没什么关系——bash(1)
实际上不必做当您执行另一个程序时,标准输入、标准输出或标准错误中的任何内容。bash(1)
甚至看不到它。它只是在等待进程终止,这样它就可以为您提供另一个 shell 提示。
当你在后台运行脚本时,你将能够bash(1)
非常快速地与你的再次交互,但任何输出仍然会通过你的ssh(1)
通道,可能会非常缓慢,并且客户端write(2)
中的系统调用ssh(1)
可能会阻塞,导致它创建的伪终端阻塞,从而导致你的脚本在它调用write(2)
。这与第一种情况完全相同——唯一的区别是您可以在bash(1)
脚本向您发送输出时键入命令,并可能kill %1
终止它,或启动其他服务,或任何其他命令。无论哪种方式,脚本都将以相同的速度运行。
在第三种情况下,当您将输出重定向到文件时,会话ssh(1)
不再是潜在瓶颈,因此也不会成为脚本执行的潜在瓶颈。它可以运行得相当快,甚至可能比没有输出重定向的情况下在本地运行还要快得多。(top(1)
当您运行生成大量终端输出的命令时,您是否见过终端的输出?)
当然,像screen(1)
(或dtach(1)
?) 这样的工具也可以让您运行脚本而不通过终端会话发送其输出,因此可能需要第四种选择。但可能还有更多方法可以运行脚本而不强制通过网络发送其输出...