關於Linux shell多線程控制無效的bug

    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 ]參數的,具體跟操做系統有關。以上緣由爲我的推測,若是有人可以知道真正的緣由,還請予以告知,哈哈哈多線程

相關文章
相關標籤/搜索