1

我的情况是我有许多进程应该在不同的远程主机中同时启动(或多或少)。生成所有远程进程的主脚本应该等待所有进程完成,然后才能继续进行下一个分布式执行。到目前为止我尝试过的方法(在 Ubuntu Server 12.04 上没有成功,/bin/sh 指向 /bin/bash)是:

#!/bin/bash

for run_input in run1.data run2.data ; do
   for i in `seq 0 10` ; do
      ssh node$i "/path/to/bin $run_input /path/to/node$i.config" &
   done
   wait
done

那么,上述方法有什么问题呢?

编辑:

请注意,每个远程主机的命令都不同。

4

2 回答 2

3

只是回答我自己的问题,我这样做的方式没有任何问题(尽管有些人可能会推荐使用 pssh 或类似的东西)。我在问题中建议的方式是使用远程主机为发送的每个命令创建一个临时 ssh 会话。这个 ssh 会话保持在后台运行,并且通过简单地调用wait,脚本应该暂停,直到所有后台子进程都完成 - 在这种情况下是 ssh 会话。

我做错了什么是我将文件输送到一个while循环中,例如:

cat file.txt | while read line ; do
    ssh node "do_something_with $line" &
done
wait

上面的问题是,当管道进入 while 循环时,会创建一个子 shell,所以创建的远程 ssh 会话不是这个脚本的孩子,而是子 shell。因此,呼叫wait没有任何效果。

于 2012-11-07T19:52:34.870 回答
1

要同时运行并行 ssh,我建议使用pssh

文档在那里:http ://www.theether.org/pssh/docs/0.2.3/pssh-HOWTO.html

然后 :

pssh -h /PATH/TO/FILE/WITH/HOSTS command
于 2012-10-01T12:36:42.717 回答