2014-04-13 94 views
5

我從一個$hostsbash的while循環線程

while read line 
do 
    ip=$line 
    check 
done < $hosts 

while循環讀取線我的問題是,我可以使用一些方法來加快這或在同一時間運行在10臺主機的檢查,每個檢查在不同的IP上,並在$host中的所有IP已被檢查完成時完成? 謝謝

回答

10

如果要等待所有的人才能完成,你可以使用wait命令可以通過& 發送任務的背景:

process_to_background & 
echo Processing ... 
wait 
echo Done 

你可以得到給定任務的pid開始背景如果你想等待一個(或幾個)特定的任務。

important_process_to_background & 
important_pid=$! 
while i in {1..10}; do 
    less_important_process_to_background $i & 
done 

wait $important_pid 
echo Important task finished 

wait 
echo All tasks finished 

但請注意:後臺進程可能會混淆輸出,因爲它們將異步運行。您可能想使用命名管道來收集它們的輸出。

編輯

由於要求在評論有可能是一個需要限制分岔的後臺進程。在這種情況下,您可以跟蹤您已經啓動了多少個後臺進程,並通過命名管道與它們進行通信。

mkfifo tmp # creating named pipe 

counter=0 
while read ip 
do 
    if [ $counter -lt 10 ]; then # we are under the limit 
    { check $ip; echo 'done' > tmp; } & 
    let $[counter++]; 
    else 
    read x < tmp # waiting for a process to finish 
    { check $ip; echo 'done' > tmp; } & 
    fi 
done 
cat /tmp > /dev/null # let all the background processes end 

rm tmp # remove fifo 
+0

這是否會循環遍歷$ hosts中的每個主機?即使有10多個?我不想啓動任何超過10個進程,它可能會開始佔用太多資源。 – radman

+0

這只是一個示例,您可以如何使用後臺進程以及如何等待它們。如果您想要指定聽起來像線程池的最大線程數。爲此,我添加了一個示例,但它可能不是最好的實現 – fejese

+0

計數器何時遞減? – Interlated

2

您可以啓動多個進程,每個進程調用函數check並等待它們完成。

while read line 
do 
    ip=$line 
    check & 
done < $hosts 
wait # wait for all child processes to finish 

這是否增加了速度取決於可用的處理器和功能check的實現。您必須確保在迭代之間check中沒有數據相關性。