2014-02-12 95 views
1

我有這個多線程平腳本

#! /bin/bash 

cd ~ 
hostname=`hostname` 
cat /opt/ip.txt | while read line; 
do 
# do something with $line here 
RES=`ping -c 2 -q $line | grep "packet loss"` 

echo "---" >> /opt/os-$hostname.txt 
echo "---" 
echo "$line $RES" >> /opt/os-$hostname.txt 
echo "$line $RES" 
done 

我怎樣才能使腳本多線程?我想加快表現。

+1

看看[GNU平行(https://www.gnu.org/software/parallel/)進行並行處理。你可能會喜歡嘗試這樣的:'parallel ping -c 2 :::: /opt/ip.txt | grep「丟包」。祝你好運! – Steve

+0

你能告訴我一些例子,我如何編輯這段代碼? –

+0

您是否嘗試過GNU並行和上面的單行程?如果您仍然在[man](https://www.gnu.org/software/parallel/man.html)頁面上苦苦掙扎,我強烈建議閱讀本教程(https://www.gnu。 org/software/parallel/parallel_tutorial.html)。這是非常值得的投資。 HTH。 – Steve

回答

3

可以使用<(...)符號用於啓動子,然後cat所有輸出端連接起來:

myping() { 
    ping -c 2 -q "$1" | grep "packet loss" 
} 

cat <(myping hostname1) <(myping hostname2) ... 

要使用這個循環,則需要先構建命令:

cat /opt/ip.txt | { 
    command='cat' 
    while read line 
    do 
    command="$command "'<'"(myping $line)" 
    done 
    eval "$command" 
} 

如果你真的想要原始分隔---,我建議在myping中增加一個echo "---"

如果要追加輸出到文件,以及使用tee

eval "$command" | tee -a /opt/os-$hostname.txt 
+0

謝謝。它的作品非常漂亮。 –