如何等待多个远程进程(通过ssh)完成?

时间:2012-10-01 12:28:40

标签: ubuntu ssh distributed wait

我的情况是我有许多进程应该在不同的远程主机中同时启动(或多或少)。生成所有远程进程的主脚本应等待所有远程进程完成,然后才进行下一次分布式执行。到目前为止我尝试过这种方式(在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

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

编辑:

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

2 个答案:

答案 0 :(得分: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无效。

答案 1 :(得分:1)

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

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

然后:

pssh -h /PATH/TO/FILE/WITH/HOSTS command