我有 1000 多台远程机器。我想在所有机器上运行一些特定命令,但要并行运行。我使用这些按顺序运行的命令:
for f in `cat host.lst`
do
./runScript.sh $f
done
假设host.lst
包含 100 个主机。我想runScript.sh
在 100 台主机上并行运行。此外,还应该维护日志。
我无法在我的计算机上安装任何实用程序,例如PSSH
.
我做了很多研究并找到了这些链接,但它们没有帮助。我不明白它们是如何工作的:
谁能解释一下其中的逻辑吗?
答案1
logdir=`mktemp -d`
bunch=200
IFS=$'\n'
for hosts in $(< hosts.lst xargs -r -L "$bunch"); do
IFS=" ";
for host in $hosts; do
ssh -n -o BatchMode=yes "$host" './runScript.sh' 1>"$logdir/$host.log" 2>&1 &
done
wait
done
假设文件中一行/行列出了 1000 个(数千个)主机hosts.lst
,然后一次从这些主机中选择了一组(200 个),并且在这 200 个主机中的每一个上都生成了您runScript.sh
使用的主机ssh
,batch mode
同时保留了从每个后台作业中涌出到目录中stdout+stderr
名为 的文件中,可以在需要时检查该文件。host
$logdir
最后,我们通过wait
内循环末尾的命令等待一组结束,然后再启动下一组for
。
答案2
对脚本的以下修改不需要任何其他实用程序,将并行执行,但可能会遇到限制,具体取决于主机打开文件句柄的限制:
for f in $(cat host.lst); do
./runScript.sh $f &
done
要将结果捕获到日志中,只需添加> run.log
后done
即可保存到新文件run.log
.
关键的变化是添加了&
,它在后台运行一个进程,而不是等待它完成后再执行下一个命令。