LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 806|回复: 0

Shell虚拟用户测试脚本

[复制链接]
发表于 2008-12-11 18:20:55 | 显示全部楼层 |阅读模式
testMain.sh

  1. #!/bin/bash
  2. # testMain.sh
  3. ###############################################
  4. # 脚本接受两个整型参数
  5. # 第一个参数为虚拟用户数(进程数)
  6. #                每个虚拟用户一个进程,默认为10
  7. # 第二个参数为虚拟用户加载的时间间隔,
  8. #        默认为15(秒)
  9. # 运行示例:
  10. #        ./testMain.sh
  11. #        ./testMain.sh 5 10
  12. ###############################################
  13. baseDir=`pwd`
  14. logDir=$baseDir/logs
  15. psFile=$baseDir/processStatus.txt
  16. rtFile=$logDir/responeTime.txt
  17. vLogFile=$logDir/VuserLog.txt

  18. #验证传入的第一个参数:虚拟用户数,默认10
  19. if [[ -z $1 ]];then
  20.         echo -en "\033[40;33mPlease enter the number of Vuser you want (default 10):\033[0m"
  21.         read vuserNum
  22.         if [[ -z $vuserNum ]];then
  23.                 vuserNum=10
  24.         fi
  25.         if [[ $vuserNum =~ ^[[:digit:]]*$ ]]; then
  26.                 vuserNum=$vuserNum
  27.         else
  28.                 vuserNum=10
  29.         fi
  30. else
  31.         vuserNum=$1
  32. fi
  33. #验证传入的第二个参数,加载间隔时间,默认为0
  34. if [[ -n $2 ]];then
  35.         if [[ $vuserNum =~ ^[[:digit:]]*$ ]]; then
  36.                 sleepTime=$2
  37.         else
  38.                 echo "Use default delay time 15 seconds."
  39.                 sleepTime=15
  40.         fi
  41. else
  42.         echo -en "\033[40;33mPlease enter a delay time for each Vuser (default 15s):\033[0m"
  43.         read sleepTime
  44.         if [[ -z $sleepTime ]];then
  45.                 sleepTime=15
  46.         fi
  47.         if [[ $sleepTime =~ ^[[:digit:]]*$ ]]; then
  48.                 vuserNum=$sleepTime
  49.         else
  50.                 vuserNum=15
  51.         fi       
  52. fi
  53. if [[ -z $3 ]];then
  54.         echo -en "\033[40;33mPlease enter the URL for test(default myBlog ^_^):\033[0m"
  55.         read testURL
  56.         if [[ -z $vuserNum ]];then
  57.                 testURL="http://higkoo.blog.sohu.com"
  58.         fi
  59. fi
  60. #如果日志目录不存在,则创建它
  61. if [ ! -x "$logDir" ];then
  62.         mkdir "$logDir"
  63. fi
  64. #新建/覆写psFile、logFile
  65. echo "Vuser List:" > $psFile
  66. echo "Start:" > $vLogFile
  67. echo -e "\033[40;32mStart $vuserNum Vuser(s),each after $sleepTime second(s).\033[0m"
  68. #创建虚拟用户进程
  69. for((i=1;i<=$vuserNum;i++))
  70. do
  71. #参数1为虚拟用户的ID
  72.         sleep $sleepTime
  73.         /bin/bash $baseDir/request.sh $i $testURL > /dev/null 2>&1 &
  74.         echo -e "\033[40;32m-- Add Vuser$i PID=$! start:"`date '+%Y%m%d%H%M%S.%N'`"\033[0m"
  75. done
  76. echo -e "\033[40;32mFinish Load ! There're $vuserNum Vuser(s) running.\033[0m"
  77. echo -e "\033[40;36mVuser status controllor file: $psFile\033[0m"
  78. echo -e "\033[40;36mVuser's status logfile: $vLogFile\033[0m"
  79. echo -e "\033[40;36mResponeTime file: $rtFile\033[0m"
复制代码


  1. #!/bin/bash
  2. # request.sh
  3. ###############################################
  4. # 脚本由testMain.sh调用
  5. # 接受一个参数:虚拟用户ID
  6. ###############################################
  7. #定义常规变量
  8. baseDir=`pwd`
  9. logDir=$baseDir/logs
  10. psFile=$baseDir/processStatus.txt
  11. rtFile=$logDir/responeTime.txt
  12. vLogFile=$logDir/VuserLog.txt
  13. myPid=$$
  14. #计算响应时间函数,精确到毫秒,传入格式为`date '+%s.%N'`
  15. getRetime(){
  16.                 tSecond=`echo $2,$1|awk -F, '{print $1-$2}'`               
  17. }
  18. #将状态写入到文件
  19. echo "Vuser$1,$myPid,1" >> $psFile
  20. echo "Vuser:$1,pid:$myPid,start:"`date '+%Y%m%d.%H%M%S.%N'` >> $vLogFile
  21. #初始化暂停标识
  22. isPaused=0
  23. #持续运行
  24. while( true )
  25. do
  26. #获取运行状态,确定是否继续运行
  27.         myStatus=`cat $psFile|grep $myPid|awk -F, '{print $3}'`
  28.         if [ -z $myStatus ] || [ $myStatus = 0 ]
  29.         then
  30.                 echo "Vuser:$1,pid:$myPid,stop:"`date '+%Y%m%d.%H%M%S.%N'` >> $vLogFile
  31.                 break
  32.         else
  33.                 if [ $myStatus = 2 ];then
  34.                         if [ $isPaused = 0 ];then
  35.                                 echo "Vuser:$1,pid:$myPid,pause:"`date '+%Y%m%d.%H%M%S.%N'` >> $vLogFile
  36.                         fi
  37.                         isPaused=1
  38.                         sleep 1
  39.                         continue
  40.                 fi
  41.         fi
  42. #判断是否为Restart
  43.                 if [ $isPaused = 1 ];then
  44.                         echo "Vuser:$1,pid:$myPid,restart:"`date '+%Y%m%d.%H%M%S.%N'` >> $vLogFile
  45.                         isPaused=0
  46.                 fi
  47. #测试代码
  48.         startTime=`date '+%s.%N'`
  49.         wget -S --output-document=$logDir/$$ $2 2> $logDir/$$.txt
  50.         endTime=`date '+%s.%N'`
  51.         #grep找到返回0,不存在返回1
  52.         #查找服务器是否正确响应       
  53.         if [ `grep "HTTP/1.1" $logDir/$$.txt |awk '{print $2}'` -ne "200" ]
  54.         then
  55.                 cat $logDir/$$.txt >> $logDir/$$.error.txt
  56.                 cat $logDir/$$ >> $logDir/$$.error.txt
  57.         else
  58.                 #查找程序的返回值是否正确
  59.                 grep "html" $logDir/$$        > /dev/null
  60.                 if [ $? = 1 ]
  61.                 then
  62.                         echo "Cann't find :html"
  63.                 else
  64.                         getRetime $startTime $endTime
  65.                         echo $tSecond >> $rtFile
  66.                 fi               
  67.         fi
  68. #删除过程中产生的日志
  69. rm -f $logDir/$$ $logDir/$$.txt
  70. 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 杀死所有测试进程。

    此脚本纯粹练手,修改一下当然也可以小用一下。欢迎拍砖!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表