linux 使用多線程 批量測試網站是否正常shell
阿新 • • 發佈:2018-06-13
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