1. 程式人生 > >linux 使用多線程 批量測試網站是否正常shell

linux 使用多線程 批量測試網站是否正常shell

shell linux

#!/bin/bash #取出網站數據 web=`cat website.txt` if [ -z "$web" ];then #判斷長度如果為0,則為真。沒有需要測試網站 echo "Data that is not tested" exit 1 fi test -f result.log && rm -f result.log #test -f 如果是一個普通文件則為真 function delay { sleep 3 } tmp_fifofile=/tmp/$$.fifo #聲明管道名稱,‘$$‘表示腳本當前運行的進程PID mkfifo $tmp_fifofile #創建管道 exec 6<>$tmp_fifofile #創建文件標示符“5”,這個數字可以為除“0”、“1”、“2”之外的所有未聲明過的字符 rm $tmp_fifofile #清除創建的管道文件 #定義並發線程數,需根據vps配置進行調整。 thread=100 for ((i=0 ;i<$thread;i++ )) do echo ; #借用read命令一次讀取一行的特性,使用一個echo默認輸出一個換行符,來確保每一行只有一個線程占位;這裏讓人聯想到生產者&消費者模型,管道文件充當消息隊列,來記錄消費者的需求,然後由生產者去領任務,並完成任務,這裏運用了異步解耦的思想。 done>&6 #將占位信息寫入管道 #開始多線程循環檢測 for url in $web do read -u6 #從文件描述符管道中,獲取一個管道的線程占位然後開始執行操作;read中 -u 後面跟fd,表示從文件描述符中讀入,該文件描述符可以是exec新開啟的。 { #curl抓取網站http狀態碼 code=`curl -o /dev/null --retry 3 --retry-max-time 8 -s -w %{http_code} $url` echo "$code ---> $url">>result.log #判斷子線程是否執行成功,並輸出結果 delay && { echo "$code ---> $url" } || { echo "Check thread error!" } echo >& 6 #任務執行完後在fd5中寫入一個占位符,以保證這個線程執行完後,線程繼續保持占位,繼而維持管道中永遠是100個線程數,&表示該部分命令/任務放入後臺不占當前的bash,實現並行處理 }& done #等待所有線程執行完畢 wait exec 6>&- #關閉fd6的管道 #找出非200返回碼的站點 echo List of exception website: cat result.log | grep -v 200 exit 0

linux 使用多線程 批量測試網站是否正常shell