SHELL-命名管道模拟线程池

SHELL-命名管道模拟线程池

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# ping-ip-by-pipe.sh
thread=5
tmp_fifo=/tmp/$$.fifo
start_time=$(date +%s)
mkfifo $tmp_fifo
exec {tmp_fd}<> $tmp_fifo #关联一个临时fd到管道
rm -rf $tmp_fifo

for i in $(seq $thread)
do
  echo $i >&${tmp_fd} #放入限定数量的空行
done

for i in {1..30}
do
  read -u ${tmp_fd} #拿走一行,进入下一步,如果无内容会等待
  {
    sleep 1
    ip=192.168.5.$i
    ping -c1 -W1 $ip &>/dev/null
    if [ $? -eq 0 ];then
      echo "$ip is up."
    else
      echo "$ip is down."
    fi
    echo >&${tmp_fd}  #放入一行
  }&
done

wait

stop_time=$(date +%s)
echo "TIME:  $(($stop_time-$start_time))"
exec {tmp_fd}<&-
exec {tmp_fd}>&-

因为在脚本中使用echo写入命名管道时,会等待一个读取管道的进程,无法进入下一步。

其实用下面的其中一个就可以关闭

1
2
exec {tmp_fd}<&-
exec {tmp_fd}>&-

shell编程(二十一)文件描述符