国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

linux中shell模擬多線程執行任務詳解

2024-08-27 23:59:15
字體:
來源:轉載
供稿:網友

多線程是對于linux系統來講是小菜了,下面小編為各位整理一篇linux中shell模擬多線程執行任務詳解,希望文章可以幫助到各位。

shell本身是不能實現多線程的,但是可以通過啟動子進程,并將子進程放入后臺執行來模擬多線程,為了在提高腳本執行效率的同時又不明顯增加負載的作用,還需要對同時放入后臺的進程數做下限制,代碼如下:

  1. #!/bin/bash 
  2. set -x  # 開啟調試模式 
  3. #判斷是否有參數 
  4. if [ $# != 1 ];then 
  5.     echo "您輸入的參數有誤" 
  6.     exit -1 
  7. fi 
  8. # 允許的最大進程數 
  9. MAX_THREAD_NUM=5 
  10. tmp_fifo_file=/tmp/$$.fifo # 以腳本運行的當前進程ID號作為文件名 
  11. mkfifo "$tmp_fifo_file"    # 新建一個隨機fifo管道文件 
  12. exec 9<>"$tmp_fifo_file"   # 定義文件描述符9指向這個fifo管道文件 
  13. rm "$tmp_fifo_file" 
  14. # 預先寫入指定數量的換行符到fifo管道文件中,一個換行符代表一個進程 
  15. for((i=0;i<$MAX_THREAD_NUM;i++));do 
  16.      echo  
  17. done >&9 
  18. # 循環讀出url并判斷狀態碼 
  19. while read line 
  20. do 
  21.     # 進程控制 
  22.     read -u 9 # 從文件描述符9中讀取行,實際指向fifo管道 
  23.     { 
  24.         isok=`curl -I -L -m 60 -o /dev/null -s -w %{http_code} $line
  25.         if [ "$isok" = "200" ];then 
  26.             echo $line "OK" 
  27.         else 
  28.             echo $line $isok 
  29.         fi 
  30.         echo >&9 # ,當前進程結束,往fifo管道文件中寫入一個空行 
  31.     }&  //Vevb.com 
  32. done < $1 wait echo '執行結束' exec 9>&- # 刪除文件描述符9 
  33. exit 0 

腳本的任務是對一個url列表中的網址進行判斷,判斷這些網址是否可以繼續訪問,具體方法是,通過curl獲取http的狀態碼來判斷.

上面紅色部分{}中的語句被放進子進程中在后臺執行,當fifo中5個空行讀完后,循環繼續等待 read 中讀取fifo數據,當后臺的子進程完成任務后,排隊往fifo輸入空行,這樣fifo中又有了數據,循環繼續執行.

下面看看shell執行的結果,代碼如下:

  1. # bash scanUrl.sh url.txt  
  2. + '[' 1 '!=' 1 ']' 
  3. + MAX_THREAD_NUM=5 
  4. + tmp_fifo_file=/tmp/Vevb.com  
  5. + mkfifo /tmp/Vevb.com  
  6. + exec 
  7. + rm /tmp/Vevb.com  
  8. + (( i=0 )) 
  9. + (( i<5 )) 
  10. + echo 
  11. + (( i++ )) 
  12. + (( i<5 )) 
  13. + echo 
  14. + (( i++ )) 
  15. + (( i<5 )) 
  16. + echo 
  17. + (( i++ )) 
  18. + (( i<5 )) 
  19. + echo 
  20. + (( i++ )) 
  21. + (( i<5 )) 
  22. + echo 
  23. + (( i++ )) 
  24. + (( i<5 )) 
  25. + read line 
  26. + read -u 9 
  27. ++ curl -I -L -m 60 -o /dev/null -s -w '%{http_code}' http://Vevb.com / 
  28. + read line 
  29. + read -u 9 
  30. ++ curl -I -L -m 60 -o /dev/null -s -w '%{http_code}' http://Vevb.com / 
  31. + read line 
  32. + read -u 9 
  33. ++ curl -I -L -m 60 -o /dev/null -s -w '%{http_code}' http://Vevb.com / 
  34. + read line 
  35. + read -u 9 
  36. ++ curl -I -L -m 60 -o /dev/null -s -w '%{http_code}' http://Vevb.com / 
  37. + read line 
  38. + read -u 9 
  39. ++ curl -I -L -m 60 -o /dev/null -s -w '%{http_code}' http://Vevb.com / 
  40. + read line 
  41. + read -u 9      # fifo文件中的5個空行讀完了,等待其它子進程寫入fifo 
  42. + isok=200 
  43. + '[' 200 = 200 ']' 
  44. + echo http://Vevb.com / OK 
  45. http://Vevb.com / OK 
  46. + echo          # 這個子進程完成任務,寫入fifo一個空行,啟動一個子進程 
  47. ++ curl -I -L -m 60 -o /dev/null -s -w '%{http_code}' http://Vevb.com / 
  48. + read line 
  49. + read -u 9 
  50. + isok=200 
  51. + '[' 200 = 200 ']' 
  52. + echo http://50vip.com/ OK 
  53. http://50vip.com/ OK 
  54. + echo 
  55. ++ curl -I -L -m 60 -o /dev/null -s -w '%{http_code}' http://Vevb.com /info/ 
  56. + read line 
  57. + read -u 9 
  58. + isok=200 
  59. + '[' 200 = 200 ']' 
  60. + echo http://361a.net/ OK 
  61. http://361a.net/ OK 
  62. + echo 
  63. ++ curl -I -L -m 60 -o /dev/null -s -w '%{http_code}' http://Vevb.com / 
  64. + read line 
  65. + wait         # 輸入文件中的url都已經處理完成或在子進程中處理,等待所有子進程結束 
  66. + isok=200 
  67. + '[' 200 = 200 ']' 
  68. + echo http://Vevb.com / OK 
  69. http://Vevb.com / OK 
  70. + echo 
  71. + isok=000 
  72. + '[' 000 = 200 ']' 
  73. + echo http://5imovie.org/ 000 
  74. http://5imovie.org/ 000 
  75. + echo 
  76. + isok=200 
  77. + '[' 200 = 200 ']' 
  78. + echo http://Vevb.com / OK 
  79. http://52ixwebhosting.com/ OK 
  80. + echo 
  81. + isok=404 
  82. + '[' 404 = 200 ']' 
  83. + echo http://Vevb.com /info/ 404 
  84. http://Vevb.com /info/ 404 
  85. + echo 
  86. + isok=000 
  87. + '[' 000 = 200 ']' 
  88. + echo http://Vevb.com / 000 
  89. http://42.hcocoa.com/ 000 
  90. + echo 
  91. + echo $'346211247350241214347273223346235237' 
  92. 執行結束 
  93. + exec 
  94. + exit 0 

下面我們再來看個例子,代碼如下:

  1. #!/bin/bash 
  2. function pinghost { 
  3. ping $1 -c 1 -w 10 |grep rtt|cut -d “/” -f6 
  4. tmp_fifofile=”/tmp/$.fifo”   # 腳本運行的當前進程ID號作為文件名 
  5. mkfifo $tmp_fifofile         # 新建一個隨機fifo管道文件 
  6. exec 6<>$tmp_fifofile         # 定義文件描述符6指向這個fifo管道文件 
  7. rm $tmp_fifofile 
  8. thread=10 
  9. for ((i=0;i<$thread;i++));do   # for循環 往 fifo管道文件中寫入10個空行 
  10. echo 
  11. done >&6 
  12. while read domain 
  13. do 
  14. read -u6                  # 從文件描述符6中讀取行(實際指向fifo管道) 
  15. pinghost ${domain};      # 執行pinghost函數 
  16. echo >&6                      # 再次往fifo管道文件中寫入一個空行。 
  17. }&                                  # 放到后臺執行 
  18. done</home/miotour/ip.txt 
  19. wait                          #因為之前的進程都是后臺執行,因此要有wait來等待所有的進程都執行完畢后才算整個腳本跑完。 
  20. exec 6>&-                #刪除文件描述符6 
  21. exit 0 

說明:{} 這部分語句被放入后臺作為一個子進程執行,這部分幾乎是同時完成的,當fifo中10個空行讀完后 while循環.

繼續等待 read 中讀取fifo數據,當后臺的10個子進程后,按次序排隊往fifo輸入空行,這樣fifo中又有了數據,for語句繼續執行.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 张掖市| 即墨市| 宁化县| 九龙坡区| 清新县| 二连浩特市| 玛多县| 通化县| 长子县| 北宁市| 高安市| 陈巴尔虎旗| 余姚市| 贵德县| 新干县| 达尔| 富锦市| 黎城县| 济源市| 阆中市| 浪卡子县| 招远市| 古浪县| 昌宁县| 高平市| 五常市| 阿拉尔市| 广东省| 江源县| 班玛县| 华容县| 衡阳县| 凤阳县| 天祝| 龙井市| 阿克苏市| 修水县| 东山县| 区。| 岳池县| 东源县|