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编程(二十一)文件描述符