#!/bin/bash
# 接受信號2(ctrl+C)
# 關閉fd 6的綁定
# 注意:綁定時可以用 exec <> fifofile;
# 但關閉時必須分開寫:exec 6>&-和exec 6<&- 是關閉fd6
trap "exec 6>&-; exec 6<&-; exit 0" 2
# 管道文件名
tempfile="temp.$$"
# 創建有名管道
# 管道的特點:
# 1. 如果管道中沒有數據,則讀管道數據的操作會阻塞,直到管道內寫入數據
# 2. 管道內有數據,如果沒有讀取操作也會阻塞,直到讀取後纔會終止這一操作
mkfifo ${tempfile}
# 綁定文件操作符爲管道
exec 6<>${tempfile}
# fd6已綁定成爲管道,不再需要管道文件,可直接刪除掉
rm -f ${tempfile}
# 併發執行線程數
tnum=10
preip="192.168.100."
# 對文件操作符進行寫入操作,通過for循環寫入$tnum個空行,即爲後臺線程數量
for ((i=1; i<=$tnum; i++)); do
{
echo >&6
}
done
for ip in $(seq 2 254); do
{
# 從文件操作符讀取管道中的一個空行
read -u 6
{
# 併發操作代碼塊
sleep 1
ping -q -c2 -W1 "${preip}$ip" &>/dev/null
if [ $? -eq 0 ]; then
echo -e "\033[32m${preip}$ip is alive.\033[0m"
else
echo -e "\033[31m${preip}$ip is down.\033[0m"
fi
# 重點:讀取完一個空行後,重新向文件操作符寫入一個空行,
# 否則當$tnum個任務放入後臺後,由於操作符中沒有可讀取的空行,導致read -u 6阻塞
echo >&6
}& # 將任務放入後臺執行
}
done
# 等待所有線程執行完畢,避免主進程提前退出
wait
# 關閉文件操作符的讀寫綁定
exec 6>&-
exec 6<&-
shell 多進程(併發)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.