shell 多進程(併發)

#!/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<&-
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章