我正在尝试在脚本的几个不同主机中运行远程二进制文件,能够在各自的主机中启动它们并在退出之前等待所有这些远程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等上运行。为什么不在每个主机上同时部署它?
答案 0 :(得分:2)
即使test
重定向,stdout
进程仍处于打开状态stderr
和foo_exe
。 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 > /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
吗?