我有一个 while 循环读取来自 a 的行$hosts
while read line
do
ip=$line
check
done < $hosts
我的问题是我可以使用某种方法来加快速度,或者一次在 10 个主机上运行检查,每个检查都在不同的 IP 上,并在所有 IP 都输入时完成$host
已被检查?
谢谢
您可以通过以下方式将任务发送到后台&
如果您打算等待所有这些完成,您可以使用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
但请注意:后台进程可能会弄乱输出,因为它们将异步运行。您可能希望使用命名管道来收集它们的输出。
edit
正如评论中所询问的,可能需要限制分叉的后台进程。在这种情况下,您可以跟踪已启动的后台进程数量并通过命名管道与它们进行通信。
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)