shell的多線程編程代碼網上有不少,示例代碼以下:shell
thead_num=5 #設置線程數,在這裏所謂的線程,其實就是幾乎同時放入後臺(使用&)執行的進程。 tmp_fifo_file="/tmp/$$.fifo" #以進程ID號命名管道文件 mkfifo $tmp_fifo_file #建立臨時管道文件 exec 6<>$tmp_fifo_file #以讀寫方式打開tmp_fifo_file管道文件,文件描述符爲6,也能夠取3-9任意描述符 rm -f $tmp_fifo_file #刪除臨時管道文件,也可不刪除 for ((i=0;i<$thead_num;i++)) #利用for循環向管道中輸入併發數量的空行 do echo "" #輸出空行 done >&6 #輸出重導向到定義的文件描述符6上 for i in $ip #循環全部要執行的服務器 do read -u6 #從管道中讀取行,每次一行,全部行讀取完畢後執行掛起,直到管道有空閒的行 { ...... #線程內的執行代碼(若是須要執行時間較長,bug就可能來了) echo "" >&6 #再寫入一個空行,使掛起的循環繼續執行 }& #放入後臺執行 done wait #等待全部後臺進程執行完成 exec 6>&- #刪除文件描述符
問題:以前遇到過一個很驚豔的bug,在用shell寫多線程時,線程數量在達到設定的數量以後繼續不斷增長,多線程控制是無效的,這bug也簡直了,我明明給了5個併發,這丫的愣是建立了幾十個進程,結果發現查了好多資料,愣是沒找到緣由,後來發現是個人每一個線程處理塊的執行時間都比較久,結果,正在 執行的進程還沒執行結束,也就是管道中尚未新的空閒的行,系統就新建立了一個新的進程,這看似很不合邏輯。編程
解決辦法:用「read -u6 -t86400」替換「read -u6」,-t後面的數字表示時間,單位是秒服務器
緣由:具體權威的緣由不太肯定,根據已知的資料,推測是由於read -u6這條命令的[ -t ]參數是有默認值的,在個人系統裏 ,好像是3min,也就是說,若是3min以後,後臺進程依然沒有執行結束,系統會認爲該進程已經執行完畢,繼續分配進程。須要特別說明的是,不是全部的系統都須要指定這個[ -t ]參數的,具體跟操做系統有關。以上緣由爲我的推測,若是有人可以知道真正的緣由,還請予以告知,哈哈哈多線程