我正在对Web服务进行临时性能分析,该服务似乎保持某种状态并且变慢和变慢,直到最终事情开始超时。我有一个简单的脚本会暴露这种行为:
while true
do
RESPONSE_CODE=$( curl --config curl.config )
if [ "$RESPONSE_CODE" -eq "200" ]; then
echo SUCCESS
else
echo FAILURE
fi
done
除了一些标题,Cookie,发布数据,网址等,curl.config
特别有以下几行:
silent
output = /dev/null
write-out = "%{http_code}"
因此curl的唯一输出应该是HTTP状态代码。
这很好用。我想做的是这样的事情:
{ time -p RESPONSE_CODE=$(curl --config curl.config) ; } 2>&1 | awk '/real/{print $2;}'
获取这些查询实际需要多长时间的运行打印输出,同时仍然保存curl的输出以供我的测试使用。但这不起作用。
如何从curl
捕获http状态并获取time
的输出以便我可以处理它们?
答案 0 :(得分:1)
正如所写:
RESPONSE_CODE = $( curl --config curl.config )
你在作业周围有空格,它在shell中不起作用(它试图以RESPONSE_CODE
作为第一个参数执行命令=
,等等。你需要:
RESPONSE_CODE=$( curl --config curl.config )
time
内置很难重定向。由于您需要HTTP状态和实时,因此您必须执行某些操作才能捕获这两个值。一种可能性是:
set -- $( (time -p -- curl --config curl.config ) 2>&1 |
awk '/real/{print $2} /^[0-9]+$/{print}')
将设置1美元和2美元。另一个是数组赋值:
data=( $( (time -p -- curl --config curl.config ) 2>&1 |
awk '/real/{print $2} /^[0-9]+$/{print}') )
HTTP响应代码应该出现在时间之前。
(使用sh -c 'echo 200; sleep 1'
代替curl --config curl.config
进行测试。)
答案 1 :(得分:1)
如果Curl的响应只有一行,这应该有效:
#!/bin/bash
RESPONSE_CODE=''
TIME=''
while read -r TYPE DATA; do
case "$TYPE" in
curl)
RESPONSE_CODE=$DATA
;;
real)
TIME=$DATA
;;
esac
done < <(exec 2>&1; time -p R=$(curl --config curl.config); echo "curl $R")
或者使用关联数组:
#!/bin/bash
declare -A RESPONSE
while read -r TYPE DATA; do
RESPONSE[$TYPE]=$DATA
done < <(exec 2>&1; time -p R=$(curl ...); echo "code $R")
echo "${RESPONSE[code] ${RESPONSE[real]}"