后台或前台的 bash 脚本通过 ssh 加速

后台或前台的 bash 脚本通过 ssh 加速

我有一个好奇:

我通过 SSH 连接运行一个 bash 脚本,该脚本有大量输出到 stdout。如果我在后台或前台运行该过程,性能会有所不同吗?

我感觉在后台运行可能会更快,即使我看到输出到 stdout,因为 bash 本身不依赖于 SSH 延迟。这有道理吗?

答案1

正如 sarnold 所指出的,在后台运行该过程不会产生明显的区别。我认为将输出重定向到文件将消除本地终端可能存在的瓶颈,从而提高速度。

无论如何,如果您仍然需要查看输出,请尝试为 ssh 添加以下选项:

ssh -c blowfish -C remotehost foo

其中 -C 将启用压缩,-c blowfish 将选择对 CPU 影响较小的密码算法

答案2

你问了两种情况,但我认为你需要第三种情况:

  1. 无背景:

    ssh remotehost
    foo
    
  2. 背景:

    ssh remotehost
    foo &
    
  3. 输出重定向:

    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)?) 这样的工具也可以让您运行脚本而不通过终端会话发送其输出,因此可能需要第四种选择。但可能还有更多方法可以运行脚本而不强制通过网络发送其输出...

相关内容