我的情况是我有许多进程应该在不同的远程主机中同时启动(或多或少)。生成所有远程进程的主脚本应等待所有远程进程完成,然后才进行下一次分布式执行。到目前为止我尝试过这种方式(在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
那么,上述方法有什么问题?
编辑:
请注意,每个远程主机的命令都不同。
答案 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