bash while循环线程

时间:2014-04-13 21:33:30

标签: multithreading bash shell while-loop

我有一个while循环读取来自$hosts

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

我的问题是,我可以使用某种方式来加快速度,或者一次对10台主机进行检查,每次检查是在不同的IP上,并在$host中的所有IP都已检查完成后完成? 谢谢

3 个答案:

答案 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