我有一个脚本循环遍历主机列表,使用RSA密钥连接到每个主机,然后将输出保存到本地计算机上的文件 - 这一切都正常。但是,在每台服务器上运行的命令需要一段时间(约30分钟),并且有10台服务器。我想并行运行命令以节省时间,但似乎无法使其正常工作。这是现在(工作)的代码:
for host in $HOSTS; do
echo "Connecting to $host"..
ssh -n -t -t $USER@$host "/data/reports/formatted_report.sh"
done
如何加快速度?
答案 0 :(得分:5)
您应该将&
添加到ssh调用的末尾,它将在后台运行。
for host in $HOSTS; do
echo "Connecting to $host"..
ssh -n -t -t $USER@$host "/data/reports/formatted_report.sh" &
done
答案 1 :(得分:3)
我尝试使用&
将SSH命令发送到后台,但我放弃了这一点,因为在完成SSH命令后,脚本会对输出文件执行更多命令,这些命令需要创建。
使用&
使脚本直接跳转到那些命令,这些命令失败,因为输出文件还没有。但后来我了解了 wait 命令,该命令在继续之前等待后台命令完成。现在这是我的代码:
for host in $HOSTS; do
echo "Connecting to $host"..
ssh -n -t -t $USER@$host "/data/reports/formatted_report.sh" &
done
wait
答案 2 :(得分:0)
尝试massh http://m.a.tt/er/massh/。这是一个在多个主机上运行ssh的好工具。
答案 3 :(得分:0)
Hypertable项目最近添加了一个多主机ssh工具。此工具使用libssh构建并建立连接并发出命令异步和并行以实现最大并行性。有关完整文档,请参阅Multi-Host SSH Tool。要在一组主机上运行命令,您可以按如下方式运行它:
$ ht ssh host00,host01,host02 /data/reports/formatted_report.sh
您还可以指定主机名或IP模式,例如:
$ ht ssh 192.168.17.[1-99] /data/reports/formatted_report.sh
$ ht ssh host[00-99] /data/reports/formatted_report.sh
它还支持--random-start-delay <millis>
选项,该选项将在每个主机上以0到<millis>
毫秒之间的随机时间间隔延迟命令的启动。当正在运行的命令访问中央资源时,此选项可用于避免雷鸣般的群体问题。