預備知識:bash
文件描述符:異步
查看:當前終端的描述符在/dev/fdide
或echo $$ 查看當前終端進程號,去/proc/進程號/fd中找spa
基本用法線程
exec fd<>file #建立一個文件句柄 ,0,1,2爲保留文件句柄不能使用 隊列
exec fd>&- or exec -fd<& #關閉文件句柄,從哪一個終端建立要在同一個終端關閉進程
使用指定線程的一個例子:消息隊列
#!/bin/bash # WD=192.168.1. THREAD=30 #要開啓的進程數 TMPFIFO=/root/test/$$.fifo #臨時管道文件 mkfifo $TMPFIFO #建立臨時管道文件 exec 1000<>$TMPFIFO #建立管道文件管理的文件句柄1000 rm -rf $TMPFIFO #刪除臨時管道文件 for ((i=1;i<=$THREAD;i++));do echo done >&1000 #循環寫入回車符到管道,後面借用read命令一次讀取一行的特性,來確保每一行只有一個線程佔位; 這裏讓人聯想到生產者&消費者模型,管道文件充當消息隊列,來記錄消費者的需求,而後由生產者 去領任務,並完成任務,這裏運用了異步解耦的思想。 for i in `seq 1 255`;do read -u1000 #從文件描述符管道中,獲取一個管道的線程佔位而後開始執行操做;read中-u後面跟fd, 表示從文件描述符中讀入,該文件描述符能夠是exec新開啓的。 { ping -c 1 -w 1 $WD$i &>/dev/null [ $? == 0 ] && echo "$WD$i is up" || echo "$WD$i is down" echo "" >&1000 #任務執行完後在fd5中寫入一個佔位符,以保證這個線程執行完後,線程繼續保持佔位, 繼而維持管道中永遠是50個線程數,&表示該部分命令/任務放入後臺不佔當前的bash, 實現並行處理 }& done >> result.txt wait #等待父進程的子進程都執行結束後執行後續操做 echo "Hello,world" exec 1000>&- #釋放文件句柄 exit 0