Process类,JAVA程序调用脚本与外部命令

目录

  • 一,说明
  • 二,编写脚本
  • 三,编写调用方法
  • 四,测试

一,说明

我们在开发时会用到需要调用外部的脚本,比如shell脚本,Python脚本等,或者是操作系统命令的一些情况,这时就可以采用Process类来实现。
下面我们实现一个简单的功能,在java程序中调用一个sh脚本,传入对应的参数,并接收脚本的返回值。

二,编写脚本

#!/bin/sh
if [ "request" == "$1" ]; then
    echo -e "{'method':'GET','data':'41234231','url':'Http://localhost:8080/demo/test'}";
elif [ "response" == "$1" ]; then
    echo -e "{'data':'success'}";
else
    echo "error";
fi

脚本名为test.sh,存储在服务器的/home/project/下。

三,编写调用方法

@GetMapping("/testShell")
public void testShell(@RequestParam("param") String param) {
    // 执行脚本的位置
    String shellPath = "/home/project/test.sh";
    // 最终在Linux中执行的命令是:sh /home/project/test.sh request/response
    String[] cmd = {"sh", shellPath, param};
    Process process = null;
    StringBuilder builder = new StringBuilder();
    String data;
    try {
        process = Runtime.getRuntime().exec(cmd);
        InputStreamReader inputStreamReader = new InputStreamReader(process.getInputStream());
        BufferedReader reader = new BufferedReader(inputStreamReader);
        while ((data = reader.readLine()) != null) {
            log.info("data is:{}", data);
            builder.append(data);
        }
        // 输出到日志文件中,System是输出到控制台,日志文件中看不到
        log.info("接收到的参数builder为:{}", builder.toString());
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (process != null) {
            process.destroy();
        }
    }
}

说明:

  • Runtime.getRuntime().exec(); 可传入一个String型的数组,也可直接传入一个字符串,传入字符串时记得命令间做空格分割。例如:
String result="/bin/sh -c "+"/home/project/test.sh "+param;
  • 通过process.getInputStream()方法可以得到脚本执行的输出信息,这里是个典型的IO操作,一层包一层,最后通过字符缓冲流读出来数据。
  • process.destroy(); 结束该进程,用于停止一些会持续执行的命令,比如长ping一个包的指令。

四,测试

服务部署到Linux中,请求testShell方法,传入对应的参数,可看到输出的信息
Process类,JAVA程序调用脚本与外部命令_第1张图片

你可能感兴趣的:(项目开发,java,开发语言)