我需要运行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
并启动下一个命令。
如何完成不依赖于彼此的分布式处理?
答案 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秒足以让你自己去看看。只需围绕它构建循环。