TASK - SSH到650服务器并从中获取一些细节,然后将完成的服务器名称写入不同的文件中。怎么能以更快的方式做到这一点?如果我做正常的ssh需要7分钟。所以,我读了关于awk并写了下面两个代码。
您能否解释一下以下代码的区别?
代码1 -
awk 'BEGIN{done_file="/home/sarafa/AWK_FASTER/done_status.txt"}
{
print "blah"|"ssh -o StrictHostKeyChecking=no -o BatchMode=yes -o ConnectTimeout=1 -o ConnectionAttempts=1 "$0" uname >/dev/null 2>&1";
print "$0" >> done_file
}' /tmp/linux
代码2 -
awk 'BEGIN{done_file="/home/sarafa/AWK_FASTER/done_status.txt"}
{
"ssh -o StrictHostKeyChecking=no -o BatchMode=yes -o ConnectTimeout=1 -o ConnectionAttempts=1 "$0" uname 2>/dev/null"|getline output;
print output >> done_file
}' /tmp/linux
当我为650台服务器运行这些代码时,代码1需要30秒,代码2需要7分钟? 为什么会有这么多时差?
文件 - / tmp / linux是650个服务器的列表
答案 0 :(得分:4)
更新答案 - 感谢@OleTange
此表格比我的建议更可取:
GNU Parallel
- 使用参数标记标记行。每个输出行都将被预先添加 使用参数和TAB(\ t)。与--onall或。结合使用时 - 这些行将以sshlogin为前缀 代替。
- nonall --onall没有参数。在所有计算机上运行该命令 用--sshlogin给出但不带参数。 GNU并行将 登录 - 并行计算机数量并运行 在电脑上工作。 -j调整登录的计算机数量 在平行下。 这对于在a上运行相同的命令(例如正常运行时间)非常有用 服务器列表。
原始答案
我建议使用parallel -j 64 -k -a /tmp/linux 'echo ssh user@{} "hostname; ls"'
执行此任务,如下所示:
hostname
将并行ssh到64个主机(您可以更改数字),在每个主机上运行ls
和-k
,然后按顺序提供所有结果(echo
切换)
当您看到它如何运作时,显然会移除 Set<String> handles = driver.getWindowHandles();
for (String handle : handles) {
System.out.println("handle = "+handle);
if (!mainHandle.equals(handle)) {
System.out.println("handle child = " + handle);
WebDriver d = driver.switchTo().window(handle);
System.out.println("swith title =" + d.getTitle());
d.close(); //d.quit(); //both not working
}
}
。