我有一个while循环读取来自$hosts
while read line
do
ip=$line
check
done < $hosts
我的问题是,我可以使用某种方式来加快速度,或者一次对10台主机进行检查,每次检查是在不同的IP上,并在$host
中的所有IP都已检查完成后完成?
谢谢
答案 0 :(得分:14)
您可以&
将任务发送到后台
如果您打算等待所有这些操作完成,可以使用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
答案 1 :(得分:3)
您可以启动多个进程,每个进程调用函数check
并等待它们完成。
while read line
do
ip=$line
check &
done < $hosts
wait # wait for all child processes to finish
这是否会增加速度取决于可用的处理器和函数check
的实现。您必须确保迭代之间check
中没有数据依赖性。
答案 2 :(得分:0)
使用GNU Parallel:
parallel check ::: $hosts