使用curl的-w选项来输出各种时间信息

  • -o /dev/null 用于丢弃响应体,只关心头部信息
  • -s 用于静默模式,不输出进度信息
  • %{http_code} 输出HTTP状态码
  • %{time_namelookup} 输出DNS解析时间
  • %{time_connect} 输出连接时间
  • %{time_total} 输出总时间(包括响应时间)

结合shell脚本的循环执行逻辑就可以批量测试了。

实例:

#!/bin/bash
# 测验URL访问速度 Test URL access speed
# author: xiongzaiqiren # 测试次数
num=3
testUrl="https://www.bing.com"
# testUrl="http://10.10.28.121/#/open/"
# testUrl="http://wenxuebank.com/book/info/b2d5e8" start_time=$(date +%Y%m%d%H%M%S)
echo -e ">>>总次数=${num} URL=${testUrl} 开始>>> \n" | tee -a "./log_testUrl_${start_time}.log" while true; do
echo ${num}
if [ ${num} -lt 1 ]; then
echo -e "<<< 完成 <<< \n" | tee -a "./log_testUrl_${start_time}.log"
break
else
date_now=$(date +%Y/%m/%d[%H:%M:%S])
total_time=$(curl -w "StatusCode: %{http_code}, 总耗时: %{time_total}, tcp连接建立时间: %{time_connect}, 服务端处理时间: %{time_starttransfer}, DNS解析时间: %{time_namelookup}, 网络响应时间: %{time_pretransfer}, 握手时间: %{time_redirect}" -o /dev/null -s "$testUrl")
total_time_show=$(echo -e "$total_time"|head -1|awk '{print $4}')
total_time_sec=$(echo -e "$total_time"|head -1|awk '{print $4}'|awk -F ['.'] '{print $1}')
if [ ${total_time_sec} -lt 1 ]; then
echo -e "【$date_now】 URL耗时 ${total_time_show} seconds,小于1s 正常\n ${total_time} \n" | tee -a "./log_testUrl_${start_time}.log"
else
echo -e "\033[1;31m############### \n 【$date_now】 URL耗时 ${total_time_show} seconds,大于1s 异常 \n ${total_time}\n################\033[0m\n" | tee -a "./log_testUrl_${start_time}.log"
fi let num--
sleep .5
fi
done
# 使用curl的-w选项来输出各种时间信息
# -o /dev/null 用于丢弃响应体,只关心头部信息
# -s 用于静默模式,不输出进度信息
# %{http_code} 输出HTTP状态码
# %{time_namelookup} 输出DNS解析时间
# %{time_connect} 输出连接时间
# %{time_total} 输出总时间(包括响应时间)

以上代码复制到.sh文件里(例如 testSingleUrlAccessSpeed.sh )然后赋予+x可执行权限。

执行过程及结果如图:

当然,也可以直接一条命令测试:

for i in {1..1000}; do \
curl -w "StatusCode: %{http_code} 总耗时: %{time_total} tcp连接建立时间: %{time_connect} 服务端处理时间: %{time_starttransfer} DNS解析时间: %{time_namelookup} 网络响应时间: %{time_pretransfer} 握手时间: %{time_redirect}" -o /dev/null -s 'http://wenxuebank.com/book/info/b2d5e8' -H 'X-MyUser-Id:1023174472804585472'; \
done | awk '{if ($4 > 1 || $10 > 1) print $0}'

也可以直接测试 DNS解析:

for i in {1..100}; do dig @192.168.0.4 xxx.xxx.com|grep "Query time" >>dns_1056.query.txt; sleep 1s;done

循环遍历测验URL访问速度

我们可以结合 for ... in ... 循环,和 while ... 循环来实现多个Url组合与多次访问测验。

原理:

  • 首先定义两个变量,分别将多个目标Url组合,与期望循环测验的次数预设起来;
  • 其次在Traverse_URLs()方法实现遍历预设的Url集合,在Loop_Nums()方法实现每个Url循环使用测验;
  • 第三在Measure_time()方法里实现Url测验核心代码。主要是通过执行curl命令并收集相关各项时间参数,以易于理解的格式输出。根据URL响应耗时时长判断正常或异常。
  • 最后,将脚本文件赋予可执行权限,执行测验即可。

完整代码:

#!/bin/bash
# 循环遍历测验URL访问速度 Loop traversal test URL access speed
# author: xiongzaiqiren # 测验目标URL的集合,多个之间用空格分隔
urls=("http://wenxuebank.com/book/info/b2d5e8" "https://www.google.com" "https://www.bing.com")
# 每个URL测验次数
num=2 ######以下是业务逻辑,请勿改动!!!(The following is the business logic, please do not modify it !!!)
start_time=$(date +%Y%m%d%H%M%S)
echo -e ">>>循环遍历次数=${num} URL数量=${#urls[@]} 开始>>> \n" | tee -a "./log_testUrl_${start_time}.log" # 定义一个函数来测量DNS解析时间
Measure_time() {
testUrl=$1
echo -e "\033[0;32m Measure_time()> $testUrl \033[0m" | tee -a "./log_testUrl_${start_time}.log" date_now=$(date +%Y/%m/%d[%H:%M:%S])
total_time=$(curl -w "StatusCode: %{http_code} 总耗时: %{time_total} tcp连接建立时间: %{time_connect} 服务端处理时间: %{time_starttransfer} DNS解析时间: %{time_namelookup} 网络响应时间: %{time_pretransfer} 握手时间: %{time_redirect}" -o /dev/null -s "$testUrl")
total_time_show=$(echo -e "$total_time"|head -1|awk '{print $4}')
total_time_sec=$(echo -e "$total_time"|head -1|awk '{print $4}'|awk -F ['.'] '{print $1}')
if [ ${total_time_sec} -lt 1 ]; then
echo -e "【$date_now】 URL耗时 ${total_time_show} seconds,小于1s 正常\n ${total_time} \n" | tee -a "./log_testUrl_${start_time}.log"
else
echo -e "\033[1;31m############### \n 【$date_now】 URL耗时 ${total_time_show} seconds,大于1s 异常 \n ${total_time}\n################\033[0m\n" | tee -a "./log_testUrl_${start_time}.log"
fi
} Loop_Nums() {
local Single_url=$1
local Single_num=$2
while true; do
# echo -e "\033[47;36m $Single_num \033[0m \033[1;36m $Single_url \033[0m" | tee -a "./log_testUrl_${start_time}.log"
if [ ${Single_num} -lt 1 ]; then
echo -e "单个URL已完成。" | tee -a "./log_testUrl_${start_time}.log"
break
else
echo -e "\033[47;36m $Single_num \033[0m \033[1;36m $Single_url \033[0m" | tee -a "./log_testUrl_${start_time}.log"
Measure_time "${Single_url}" let Single_num--
sleep .5
fi
done
} Traverse_URLs() {
# 循环遍历URL数组
for url in "${urls[@]}"; do
echo -e "\033[47;30m -----Start----- ${url} \033[0m" | tee -a "./log_testUrl_${start_time}.log"
# 测量DNS时间
Loop_Nums "${url}" $num echo -e "\033[47;30m -----Complete----- ${url} \033[0m \n" | tee -a "./log_testUrl_${start_time}.log"
done
} Traverse_URLs # 使用curl的-w选项来输出各种时间信息
# -o /dev/null 用于丢弃响应体,只关心头部信息
# -s 用于静默模式,不输出进度信息
# %{http_code} 输出HTTP状态码
# %{time_namelookup} 输出DNS解析时间
# %{time_connect} 输出连接时间
# %{time_total} 输出总时间(包括响应时间)

将代码复制到你的Linux里面,文件命名为 testUrlAccessSpeed.sh,赋予可执行权限 sudo chmod +x testUrlAccessSpeed.sh 修改开头的两个变量的值(urls、num),然后就可以执行了。

示例:



执行过程记录在相同目录下的 log_testUrl_20241231xxx.log 日志文件里。

【完】

Linux服务器上shell脚本批量循环测试接口连通性,bash工具循环测试curl性能的更多相关文章

  1. Java 连接远程Linux 服务器执行 shell 脚本查看 CPU、内存、硬盘信息

    pom.xml jar 包支持 <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch& ...

  2. linux 远端执行shell脚本 批量结束各个远端节点进程

    #以下是一个本地的shell脚本,用于同时重启远端多台服务器tomcat服务 #!/bin/sh# ancyshi 重新启动节点tomcat服务function restartNodeTomcatSe ...

  3. Shell脚本实现超简洁的在Linux服务器上安装nginx、resin、java、tomcat、redis等程序

    说明: 用平常的方式在Linux服务器上安装程序,需要下载安装包.进入安装包位置.给安装包文件赋予可执行权限.执行安装.设置环境变量--等等一系列复杂的操作.并且如果有关联也需要一个一个的挨着安装.耗 ...

  4. Linux利用nc命令脚本批量检测服务器指定端口是否开放

    一.nc命令检测端口的用法 # nc -v -w 10 %IP% -z %PORT% -v 显示指令执行过程. -w <超时秒数> 设置等待连线的时间. -u 表示使用UDP协议 -z 使 ...

  5. Linux 服务器系统监控脚本 Shell【转】

    转自: Linux 服务器系统监控脚本 Shell - 今日头条(www.toutiao.com)http://www.toutiao.com/i6373134402163048961/ 本程序在Ce ...

  6. Linux shell脚本 批量创建多个用户

    Linux shell脚本 批量创建多个用户 #!/bin/bash groupadd charlesgroup for username in charles1 charles2 charles3 ...

  7. shell脚本批量执行命令----必需判断上一步执行结果--没有捷径

    # 注意:shell脚本批量执行命令,不能只写一个函数,然后把所有命令复制进去,之前试过这样是不行的.必须要有一个判断命令执行成功与否的语句 # 简单的命令可以不加结果判断符号,但是遇到解压包.sed ...

  8. 监控Linux服务器上python服务脚本

    提供给公司使用的测试平台这两天频繁地挂掉,影响到相关同事的正常使用,决定在服务器上写个监控脚本,监控到服务挂了就启动起来,一分钟检查一次.注:后台服务使用的是python.监控脚本如下: NUM=`p ...

  9. linux系统配置文件或shell脚本批量注释

    1. 配置文件批量注释 1.1 批量注释 ① 进入命令行模式,按ctrl + v进入 visual block模式,键盘上下箭头选中多行,把需要注释的行标记起来 ② 按大写字母I,再输入注释符:# ③ ...

  10. Linux服务器上监控网络带宽的18个常用命令nload, iftop,iptraf-ng, nethogs, vnstat. nagios,运用Ntop监控网络流量

    Linux服务器上监控网络带宽的18个常用命令 本文介绍了一些可以用来监控网络使用情况的Linux命令行工具.这些工具可以监控通过网络接口传输的数据,并测量目前哪些数据所传输的速度.入站流量和出站流量 ...

随机推荐

  1. JESD79-5C_v1.30-2024 JEDEC DDR5 SOLID STATE TECHNOLOGY ASSOCIATION 最新内存技术规范

    JESD79-5C_v1.30-2024 JEDEC DDR5 SOLID STATE TECHNOLOGY ASSOCIATION 最新DDR5内存技术规范 ​ JEDEC 技术协会公布新 DDR5 ...

  2. pycharm里的jinja2注释问题

    pycharm里html注释是{# #}而不是<!-- -->?   修改方式:如图修改成值None以后,command+/快捷键,html注释的符号就是<!-- 注释内容 --&g ...

  3. Java Study For Six Day( 面向对象二)

    static(静态)关键字 用于修饰成员(成员变量和成员函数) 被修饰后的成员具备以下的特点 随着类的加载而加载 优先于对象存在 被所有的对象共享 可以被类名直接调用 静态注意事项 静态方法只能访问静 ...

  4. golang不同版本特性

    Go 1.0[1]  - 2012 年 3 月: 随着 Go 第一个版本发布的还有一份兼容性说明文档[2] .该文档承诺,Go 的未来版本会尽可能确保向后兼容性,不会破坏现有程序. For insta ...

  5. jackson 中对 null 的处理

    前情提要: 在项目中如何将null值转变为空字符串呢? @Configuration public class JacksonConfig { @Bean @Primary @ConditionalO ...

  6. JavaScript 样式操作

    1.类名操作 class类名以字符串的形式存储到标签和Dom元素的属性中,标签属性为class,Dom元素属性为className,两个属性是均支持读取和修改,修改其中的一个会同步至另一个属性 cla ...

  7. 编译器-FOLLOW集合

    语法分析器的两个重要函数 FIRST和FOLLOW 一.FOLLOW的定义 在句型中紧跟在A右边的终结符号的集合 如果A是某些句型的最右符号,那么$在FOLLOW(A)中 A:非终结符 二.计算方法 ...

  8. ProWindow的控制按钮状态

    在使用ArcGIS.Desktop.Framework.Controls.ProWindow时,有网友发现,设置窗口调整模式后,窗口的控制按钮是不全的. ProWindow win = new Pro ...

  9. Linux清理内存,清理储存

    因为工作中项目部署服务器后更新迭代或者服务器使用时间长后会出现内存/储存爆满,所以整合了一下,方便以后使用: 清理虚拟内存 查看内存 free -h 清理缓存 输入命令释放内存 0 – 不释放 1 – ...

  10. docker安装cas

    直接docker pull apereo/cas ,docker run的时候各种报错: standard_init_linux.go:178: exec user process caused &q ...