记录通过命令脚本调用http请求,进行判断某一服务是否成功启动的bat/shell脚本写法 - Go语言中文社区

记录通过命令脚本调用http请求,进行判断某一服务是否成功启动的bat/shell脚本写法


最近在做CI/CD,其中就不乏编写脚本,在进行新版本发布后,需要重新启动程序,这里需要等待程序启动成功后,再进行测试脚本的执行。在Linux系统下直接使用 curl 命令调用http,非常方便。在windows下,我安装了curl,进行尝试,直接在cmd窗口中调用,命令输出为我期待的结果,但是写入bat中捕获不了输出结果,所以最后windows下采用的自己编写java程序进行判断的方式。

linux系统下shell脚本用curl命令

这里是通过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系统下bat脚本判断

在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%
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/baidu_38115306/article/details/103195174
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢