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

#!/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
相關文章
相關標籤/搜索