如果我给出某些命令行参数,则通过bash脚本运行远程二进制文件

时间:2013-06-07 04:31:39

标签: bash shell

我正在尝试在脚本的几个不同主机中运行远程二进制文件,能够在各自的主机中启动它们并在退出之前等待所有这些远程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等上运行。为什么不在每个主机上同时部署它?

2 个答案:

答案 0 :(得分:2)

即使test重定向,stdout进程仍处于打开状态stderrfoo_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

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

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

答案 1 :(得分: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/