使用 shell 脚本在多个服务器上并行执行命令

使用 shell 脚本在多个服务器上并行执行命令

我有 1000 多台远程机器。我想在所有机器上运行一些特定命令,但要并行运行。我使用这些按顺序运行的命令:

for f in `cat host.lst`
do
       ./runScript.sh $f
done

假设host.lst包含 100 个主机。我想runScript.sh在 100 台主机上并行运行。此外,还应该维护日志。

我无法在我的计算机上安装任何实用程序,例如PSSH.

我做了很多研究并找到了这些链接,但它们没有帮助。我不明白它们是如何工作的:

在许多服务器上通过 SSH 自动运行命令

对匹配模式的多个文件并行执行命令

谁能解释一下其中的逻辑吗?

答案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使用的主机sshbatch mode同时保留了从每个后台作业中涌出到目录中stdout+stderr名为 的文件中,可以在需要时检查该文件。host$logdir

最后,我们通过wait内循环末尾的命令等待一组结束,然后再启动下一组for

答案2

对脚本的以下修改不需要任何其他实用程序,将并行执行,但可能会遇到限制,具体取决于主机打开文件句柄的限制:

for f in $(cat host.lst); do
       ./runScript.sh $f &
done

要将结果捕获到日志中,只需添加> run.logdone即可保存到新文件run.log.

关键的变化是添加了&,它在后台运行一个进程,而不是等待它完成后再执行下一个命令。

相关内容