社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
最近在做CI/CD,其中就不乏编写脚本,在进行新版本发布后,需要重新启动程序,这里需要等待程序启动成功后,再进行测试脚本的执行。在Linux系统下直接使用 curl 命令调用http,非常方便。在windows下,我安装了curl,进行尝试,直接在cmd窗口中调用,命令输出为我期待的结果,但是写入bat中捕获不了输出结果,所以最后windows下采用的自己编写java程序进行判断的方式。
这里是通过curl调用http将结果赋值给RESP变量,判断RESP中返回是否有200,有则代表请求成功,那么服务启动成功;如果一直未返回200,则超时退出
curl命令格式说明: curl --user username:password -sL -w “%{http_code} %{url_effective}n” http路径 -o /dev/null
(-sL -w为curl命令参数,各参数含义可以通过curl --help查看。 -w表示将结果输出。 /dev/null是将输出流重定向,不作为标准输出,界面不会有curl 命令的输出)
如:
RESP="$( curl --user admin:admin -sL -w "%{http_code} %{url_effective}\n" http://localhost:8181/restconf/modules -o /dev/null )"
运行结果(200 为 %{http_code}
,http://213.213.1.235:8181/restconf/modules为 %{url_effective}
的值):
不加-o /dev/null
的输出如下,此时将http://213.213.1.235:8181/restconf/modules请求的返回结果response进行输出
全部命令如下:
COUNT="0"
while true; do
RESP="$( curl --user admin:admin -sL -w "%{http_code} %{url_effective}\n" http://localhost:8181/restconf/modules -o /dev/null )"
echo $RESP
if [[ $RESP == *"200"* ]]; then
echo Controller is UP
break
elif (( $COUNT > "600" )); then
echo Timeout Controller DOWN
exit 1
else
COUNT=$(( ${COUNT} + 1 ))
sleep 1
if [[ $(($COUNT % 10)) == 0 ]]; then
echo already waited ${COUNT} seconds...
fi
fi
done
在windows下由于使用curl命令方式bat脚本未成功,这里采用的是写java代码判断方式,JAVA代码如下
public static void main(String [] args){
try {
if(args.length < 1){
System.out.println("ERROR:no args");
System.exit(1);
}
String urlStr = args[0];
URL url = new URL(urlStr);
long a = 0;
long current = System.currentTimeMillis();
while(true){
HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection();
httpConnection.setRequestMethod("GET");
httpConnection.setRequestProperty("Content-Type", "application/json");
//这里我直接用的admin:admin用户名密码加密后的结果,也可以采用用户名密码加密,如下注释中
//String userPass = "admin:admin";
/*说明:这里Base64的包为org.apache.commons.codec.binary.Base64 对应jar包groupId和artifactId都为commons-codec*/
//String encode = new String(Base64.encodeBase64(userPass .getBytes())); //结果为YWRtaW46YWRtaW4=
httpConnection.setRequestProperty("Authorization", "Basic YWRtaW46YWRtaW4=");
int code = 0;
try{
code = httpConnection.getResponseCode();
}catch(IOException e){
}
if(code == 200){
System.out.println("status 200 ," + urlStr + " ,request successful.");
break;
}
long timeout = 2*60*1000;
if(a > timeout){
System.out.println(String.format("ERROR:timeout %d seconds, exit 1", timeout/1000));
System.exit(1);
}
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
}
a = System.currentTimeMillis() - current;
System.out.println(urlStr+" ,already wait s:"+a/1000);
}
} catch (MalformedURLException e) {
e.printStackTrace();
System.out.println("Exception:MalformedURLException, exit 2");
System.exit(2);
}catch(IOException e){
System.out.println("Exception IOException, exit 2");
System.exit(2);
}
}
bat脚本命令如下(checkstart.jar为上面JAVA代码导出的可执行Jar包):
@echo off
SET currentDir=D:lwxtest
java -jar %currentDir%checkstart.jar http://127.0.0.1:8181/restconf/modules
if ERRORLEVEL 1 ( echo connect failed ) else ( echo connect successful )
在windows系统下,我安装了curl后,执行命令,输出结果也是预期结果,但是通过bat FOR命令截取到的结果却不是预期结果,我在网上查询说通过FOR命令截取结果,但是得到的结果不是输出结果,然后有说bat命令要截取命令行输出是十分困难的,未找到解决方式,如果有好的意见或者方式的可评论中给出,十分感谢
windows下在cmd中运行的命令结果:
通过bat的命令结果,输出与直接执行不一致,应该是bat命令获取的方式不正确,但我还未找到正确的方式
bat命令为:
@echo off
@setlocal enableextensions enabledelayedexpansion
set str=
for /F %%i in ( 'curl --user admin:admin -sL -w "%{http_code} %{url_effective}" http://127.0.0.1:8181/restconf/modules -o /dev/null' ) do ( set str=!str!%%i )
echo %str%
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!