|
testMain.sh
- #!/bin/bash
- # testMain.sh
- ###############################################
- # 脚本接受两个整型参数
- # 第一个参数为虚拟用户数(进程数)
- # 每个虚拟用户一个进程,默认为10
- # 第二个参数为虚拟用户加载的时间间隔,
- # 默认为15(秒)
- # 运行示例:
- # ./testMain.sh
- # ./testMain.sh 5 10
- ###############################################
- baseDir=`pwd`
- logDir=$baseDir/logs
- psFile=$baseDir/processStatus.txt
- rtFile=$logDir/responeTime.txt
- vLogFile=$logDir/VuserLog.txt
- #验证传入的第一个参数:虚拟用户数,默认10
- if [[ -z $1 ]];then
- echo -en "\033[40;33mPlease enter the number of Vuser you want (default 10):\033[0m"
- read vuserNum
- if [[ -z $vuserNum ]];then
- vuserNum=10
- fi
- if [[ $vuserNum =~ ^[[:digit:]]*$ ]]; then
- vuserNum=$vuserNum
- else
- vuserNum=10
- fi
- else
- vuserNum=$1
- fi
- #验证传入的第二个参数,加载间隔时间,默认为0
- if [[ -n $2 ]];then
- if [[ $vuserNum =~ ^[[:digit:]]*$ ]]; then
- sleepTime=$2
- else
- echo "Use default delay time 15 seconds."
- sleepTime=15
- fi
- else
- echo -en "\033[40;33mPlease enter a delay time for each Vuser (default 15s):\033[0m"
- read sleepTime
- if [[ -z $sleepTime ]];then
- sleepTime=15
- fi
- if [[ $sleepTime =~ ^[[:digit:]]*$ ]]; then
- vuserNum=$sleepTime
- else
- vuserNum=15
- fi
- fi
- if [[ -z $3 ]];then
- echo -en "\033[40;33mPlease enter the URL for test(default myBlog ^_^):\033[0m"
- read testURL
- if [[ -z $vuserNum ]];then
- testURL="http://higkoo.blog.sohu.com"
- fi
- fi
- #如果日志目录不存在,则创建它
- if [ ! -x "$logDir" ];then
- mkdir "$logDir"
- fi
- #新建/覆写psFile、logFile
- echo "Vuser List:" > $psFile
- echo "Start:" > $vLogFile
- echo -e "\033[40;32mStart $vuserNum Vuser(s),each after $sleepTime second(s).\033[0m"
- #创建虚拟用户进程
- for((i=1;i<=$vuserNum;i++))
- do
- #参数1为虚拟用户的ID
- sleep $sleepTime
- /bin/bash $baseDir/request.sh $i $testURL > /dev/null 2>&1 &
- echo -e "\033[40;32m-- Add Vuser$i PID=$! start:"`date '+%Y%m%d%H%M%S.%N'`"\033[0m"
- done
- echo -e "\033[40;32mFinish Load ! There're $vuserNum Vuser(s) running.\033[0m"
- echo -e "\033[40;36mVuser status controllor file: $psFile\033[0m"
- echo -e "\033[40;36mVuser's status logfile: $vLogFile\033[0m"
- echo -e "\033[40;36mResponeTime file: $rtFile\033[0m"
复制代码
- #!/bin/bash
- # request.sh
- ###############################################
- # 脚本由testMain.sh调用
- # 接受一个参数:虚拟用户ID
- ###############################################
- #定义常规变量
- baseDir=`pwd`
- logDir=$baseDir/logs
- psFile=$baseDir/processStatus.txt
- rtFile=$logDir/responeTime.txt
- vLogFile=$logDir/VuserLog.txt
- myPid=$$
- #计算响应时间函数,精确到毫秒,传入格式为`date '+%s.%N'`
- getRetime(){
- tSecond=`echo $2,$1|awk -F, '{print $1-$2}'`
- }
- #将状态写入到文件
- echo "Vuser$1,$myPid,1" >> $psFile
- echo "Vuser:$1,pid:$myPid,start:"`date '+%Y%m%d.%H%M%S.%N'` >> $vLogFile
- #初始化暂停标识
- isPaused=0
- #持续运行
- while( true )
- do
- #获取运行状态,确定是否继续运行
- myStatus=`cat $psFile|grep $myPid|awk -F, '{print $3}'`
- if [ -z $myStatus ] || [ $myStatus = 0 ]
- then
- echo "Vuser:$1,pid:$myPid,stop:"`date '+%Y%m%d.%H%M%S.%N'` >> $vLogFile
- break
- else
- if [ $myStatus = 2 ];then
- if [ $isPaused = 0 ];then
- echo "Vuser:$1,pid:$myPid,pause:"`date '+%Y%m%d.%H%M%S.%N'` >> $vLogFile
- fi
- isPaused=1
- sleep 1
- continue
- fi
- fi
- #判断是否为Restart
- if [ $isPaused = 1 ];then
- echo "Vuser:$1,pid:$myPid,restart:"`date '+%Y%m%d.%H%M%S.%N'` >> $vLogFile
- isPaused=0
- fi
- #测试代码
- startTime=`date '+%s.%N'`
- wget -S --output-document=$logDir/$$ $2 2> $logDir/$$.txt
- endTime=`date '+%s.%N'`
- #grep找到返回0,不存在返回1
- #查找服务器是否正确响应
- if [ `grep "HTTP/1.1" $logDir/$$.txt |awk '{print $2}'` -ne "200" ]
- then
- cat $logDir/$$.txt >> $logDir/$$.error.txt
- cat $logDir/$$ >> $logDir/$$.error.txt
- else
- #查找程序的返回值是否正确
- grep "html" $logDir/$$ > /dev/null
- if [ $? = 1 ]
- then
- echo "Cann't find :html"
- else
- getRetime $startTime $endTime
- echo $tSecond >> $rtFile
- fi
- fi
- #删除过程中产生的日志
- rm -f $logDir/$$ $logDir/$$.txt
- done
复制代码
把两个脚本放在同一个目录运行 `bash testMain.sh` ,会在同目录下生成一个processStatus.txt文件,里面是当前在运行的虚拟用户的信息和状态,把状态改为0,虚拟用户就停了,改为2,虚拟用户就暂停,再改为1就继续运行。
同时生成Log目录,里面记录有响应时间和虚拟用户加载日志。
脚本没有设置运行时长,停止可以修改processStatus.txt里虚拟用户对应的状态,或删除processStatus.txt里的内容,或删除这个文件,程序即停止运行。
或运行 kill -9 `ps aux | grep request.sh | cut -c9-14` 2>/dev/null 杀死所有测试进程。
此脚本纯粹练手,修改一下当然也可以小用一下。欢迎拍砖! |
|