1

我正在尝试通过脚本在几个不同的主机中运行远程二进制文件,能够在各自的主机中启动它们并在退出之前等待所有这些远程 ssh 命令是有意义的。我这样做的尝试是这样的:

for host in A B C
do
    ssh user@$host "
    function test
    {
        cd /path/to/foo
        ./foo_exe --optA > run.out 2>&1
    }; test &
done

wait

不幸的是,这似乎是按顺序运行的,首先在主机 A 上运行,然后在 B 等上运行。为什么这不是在每个主机上同时部署的?

4

2 回答 2

2

即使重定向它们,您的test进程也保持打开状态。在这些关闭之前不会完成。最简单的方法是重定向它们:stdoutstderrfoo_exessh

for host in A B C
do
    ssh user@$host '
    function test
    {
        cd /path/to/foo
        ./foo_exe --optA > run.out 2>&1
    }; test > /dev/null 2>&1 &'
done

更具体地说,sshd您的 ssh 连接到的远程服务器上的进程会生成一个 shell 进程并侦听对与 stdout/stderr 关联的管道的写入,以便它可以通过网络将它们转发回您的本地 ssh。它一直在侦听,直到在管道上收到文件结束通知,然后关闭链接。仅当没有进程打开管道以进行输出时,它才会收到文件结束通知。这是管道的标准行为。(比这更复杂:有一堆虚拟终端魔法正在发生,但我不确定它到底是如何工作的:我必须查一下。)

barmarssh建议的后台操作将使您ssh在本地计算机上留下许多等待远程端完成的进程,而使用我的方法,ssh 会立即完成。

于 2013-06-07T07:59:24.907 回答
1

ssh命令放在后台,而不是远程命令。

for host in A B C
do
    ssh user@$host "
    function test
    {
        cd /path/to/foo
        ./foo_exe --optA > run.out 2>&1
    }; test" &
done

wait

原因是ssh等待服务器在退出之前关闭网络连接。它不会因为远程命令在后台而进入后台。

顺便说一句,你听说过pssh吗?

http://www.theether.org/pssh/

于 2013-06-07T04:40:47.930 回答