awk并行运行吗?

时间:2015-10-20 07:47:49

标签: linux bash awk ssh parallel-processing

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个服务器的列表

1 个答案:

答案 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 } }