2014-04-06 30 views
2

我有一个脚本循环访问主机列表,通过SSH使用RSA密钥连接每个主机,然后将输出保存到本地计算机上的文件 - 这一切都可以正常运行。但是,要在每台服务器上运行的命令需要一段时间(约30分钟),并且有10台服务器。我想并行运行这些命令以节省时间,但似乎无法使其工作。这里是代码,因为它是现在(工作):同时向多个主机发送SSH

for host in $HOSTS; do 
    echo "Connecting to $host".. 
    ssh -n -t -t [email protected]$host "/data/reports/formatted_report.sh" 
done 

我该如何加快速度?

+1

看看[parallel ssh](https://code.google.com/p/parallel-ssh/)和[mass parallel ssh](http://sourceforge.net/projects/mpssh/),仅举几个项目。 – chepner

回答

2

我试着用&到SSH命令发送到后台,但我放弃了这个,因为SSH命令完成后,脚本的输出文件,这就需要已经创建执行一些命令。

使用&使脚本直接跳到那些由于输出文件尚未存在而失败的命令。但后来我了解到等待命令等待后台命令完成,然后继续。现在这是我的代码,它的工作原理:

for host in $HOSTS; do 
    echo "Connecting to $host".. 
    ssh -n -t -t [email protected]$host "/data/reports/formatted_report.sh" & 
done 
wait 
5

你应该添加&到ssh调用的结尾,它会在后台运行。

for host in $HOSTS; do 
    echo "Connecting to $host".. 
    ssh -n -t -t [email protected]$host "/data/reports/formatted_report.sh" & 
done 
+0

谢谢,我已经试过这个,但它接近答案(看我发布的内容)作为答案 – user3502260

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>毫秒之间的随机时间间隔。当运行的命令访问中央资源时,可以使用此选项来避免雷鸣群体问题。

相关问题