我從一個$hosts
bash的while循環線程
while read line
do
ip=$line
check
done < $hosts
while循環讀取線我的問題是,我可以使用一些方法來加快這或在同一時間運行在10臺主機的檢查,每個檢查在不同的IP上,並在$host
中的所有IP已被檢查完成時完成? 謝謝
我從一個$hosts
bash的while循環線程
while read line
do
ip=$line
check
done < $hosts
while循環讀取線我的問題是,我可以使用一些方法來加快這或在同一時間運行在10臺主機的檢查,每個檢查在不同的IP上,並在$host
中的所有IP已被檢查完成時完成? 謝謝
如果要等待所有的人才能完成,你可以使用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
您可以啓動多個進程,每個進程調用函數check
並等待它們完成。
while read line
do
ip=$line
check &
done < $hosts
wait # wait for all child processes to finish
這是否增加了速度取決於可用的處理器和功能check
的實現。您必須確保在迭代之間check
中沒有數據相關性。
這是否會循環遍歷$ hosts中的每個主機?即使有10多個?我不想啓動任何超過10個進程,它可能會開始佔用太多資源。 – radman
這只是一個示例,您可以如何使用後臺進程以及如何等待它們。如果您想要指定聽起來像線程池的最大線程數。爲此,我添加了一個示例,但它可能不是最好的實現 – fejese
計數器何時遞減? – Interlated