如何从master向slave机器发出shell命令并等待所有命令完成?

时间:2017-07-31 18:32:33

标签: shell sh distributed

我需要运行4个shell命令,它们不相互依赖。

我有4台奴隶机器。所以,我想在4台机器中的每台机器上运行4个命令中的一个,然后我想等到它们全部4个完成。

如何分发此处理?这就是我试过的:

$1是从机的ip地址列表。

for host in $(cat $1)
do
    echo $host
    # ssh into each machine and launch command
    ssh username@$host <command>;
done

但这似乎等待命令完成,然后继续下一个host并启动下一个命令。

如何完成不依赖于彼此的分布式处理?

3 个答案:

答案 0 :(得分:2)

我会像这样使用 GNU Parallel - 在4台服务器上并行运行hostname

parallel -j 4 --nonall -S 192.168.0.1,192.168.0.2,192.168.0.3,192.168.0.4 hostname

如果您需要传递参数,请使用--onall并在:::

之后输入参数
parallel -j 4 --onall -S 192.168.0.1,192.168.0.2,192.168.0.3,192.168.0.4 echo ::: hello

如果您希望输出行标记主机名/ IP,请添加--tag

如果要按顺序保持输出,请添加-k

:添加到服务器列表中以便在本地主机上运行。

答案 1 :(得分:1)

如果您不关心同时运行多少命令,只需将每个命令放在后台&,然后将它们作为一组等待。

while IFS= read -r host; do
    ssh username@$host <command> &
done < "$1"
wait

注意使用while循环而不是for循环;见Bash FAQ 001

答案 2 :(得分:0)

脚本的ssh部分必须如下:

$ ssh -f user@host "sh -c 'sleep 30 ; nohup ls > foo 2>&1 &'"

这个睡眠时间为30秒,并将ls的输出写入文件foo。 30秒足以让你自己去看看。只需围绕它构建循环。