2015-10-20 72 views
2

TASK - SSH到650服務器並從中獲取一些細節,然後將完成的服務器名稱寫入不同的文件。如何以更快的速度做到這一點?如果我做正常的ssh,則需要7分鐘。所以,我讀了awk並寫了以下2個代碼。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級的服務器

回答

4

更新答案名單 - 與感謝@OleTange

這種形式是最好我的建議:

parallel -j 0 --tag --slf /tmp/linux --nonall 'hostname;ls' 

- 標籤帶參數的標籤行。每個輸出行將被前綴 與參數和TAB(\ t)。如果與--onall或 結合使用,則不會將這些行替換爲sshlogin 。

--nonall --onall無參數。在使用--sshlogin給出的所有計算機上運行命令 ,但不帶任何參數。 GNU並行將 並行登錄到--jobs數量的計算機並在計算機上運行 作業。 -j調整並行登錄到 的計算機數量。 這對於在 服務器列表上運行相同的命令(例如正常運行時)很有用。

原來的答案

我會建議使用GNU Parallel這個任務,像這樣:

parallel -j 64 -k -a /tmp/linux 'echo ssh [email protected]{} "hostname; ls"' 

將ssh到並列64臺主機(你可以改變的數量),運行hostnamels,然後按順序給你所有的結果(-k開關)。

當你看到它的工作方式時,顯然刪除了echo

+0

我正在使用HPUX服務器來SSH不同的操作系統上運行不同的服務器(如RedHat,Aix,Solaris,HPUX本身)。 此HPUX服務器沒有此並行命令,也不允許我安裝它。 這些代碼是否有任何不良影響?你不推薦這些嗎?如果不是,那爲什麼? – user3114179

+1

'GNU Parallel'是一個Perl腳本 - 你不允許編寫/使用Perl嗎?對不起,我無法評論哪些代碼是好的還是壞的,什麼是可以使用也不能使用 - 我只是說我相信GNU Parallel非常適合快速,準確和輕鬆地完成您的任務。可能有其他方法,可能會更好或更糟,您可能會或可能不會被允許使用 - 如果有的話,那很好。 –

+1

你會想用--nonall代替:parallel -j 0 --tag --slf/tmp/linux --nonall'hostname; ls' –