java项目-ProcessBuilder执行命令或者调用脚本

时间:2025-04-04 08:03:59

ProcessBuilder执行命令或者调用脚本

主要方法

构造方法 :

ProcessBuilder(List<String> command) :利用指定的操作系统程序和参数构造一个进程生成器。
ProcessBuilder(String… command) :利用指定的操作系统程序和参数构造一个进程生成器。

方法 : 

start():使用此进程生成器的属性启动一个新进程。
command() : 返回此进程生成器的操作系统程序和参数。
command(List<String> command) :设置此进程生成器的操作系统程序和参数。 
command(String… command) :设置此进程生成器的操作系统程序和参数。 
directory() :返回此进程生成器的工作目录。
directory(File directory) :设置此进程生成器的工作目录。
environment() :返回此进程生成器环境的字符串映射视图。 environment方法获得运行进程的环境变量,得到一个Map,可以修改环境变量 
redirectErrorStream() :返回进程生成器是否合并标准错误和标准输出;true为合并,false为不合并
redirectErrorStream(boolean redirectErrorStream) :设置此进程生成器的 redirectErrorStream 属性。默认值为false不合并

Process 获取执行结果

概述

Process类是一个抽象类(所有的方法均是抽象的),封装了一个进程(即一个执行程序)。
Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法。
() 和 方法创建一个本机进程,并返回 Process 子类的一个实例,该实例可用来控制进程并获取相关信息。创建的子进程没有自己的终端或控制台。它的所有标准 io(即 stdin,stdout,stderr)操作都将通过三个流 (getOutputStream(),getInputStream(),getErrorStream()) 重定向到父进程,通过流的形式进行读取。

主要方法

destroy():杀掉子进程。 
exitValue():返回子进程的出: 获得子进程的错误流。 
InputStream getInputStream() :获得子进程的输入流。 
OutputStream getOutputStream() :获得子进程的输出流。 
waitFor() :导致当前线程等待,如果必要,一直要等到由该 Process 对象表示的进程已经终止

 注意:
()杀掉子线程的状态在五分钟后进程才会消失
2.执行linux命令,若命令包含一些特殊字符,需要封装ProcessBuilder 来获取Process对象.

实现逻辑

我的脚本文件是service。路径是在项目路径下的bin目录中。

public class ShellExecutor {

    private static final Logger LOGGER = ();

    public static Map<String, List<String>> executeScript(String command){

        Map<String, List<String>> listMap = new HashMap<>();

        String filePath = ("") +  + "bin";
        ("file path:" + filePath);
        String fileCommand = "./service";
        List<String> commands = (fileCommand, command);
        ProcessBuilder processBuilder = new ProcessBuilder();
        File file = new File(filePath);
        if(!()){
            ("file:[" + filePath + "] not exist!");
            return listMap;
        }
        (file);
        (commands);

        BufferedReader inputReader = null;
        BufferedReader errorReader = null;
        List<String> returnString = ();
        List<String> errorString = ();
        ("normal", returnString);
        ("error", errorString);
        try {
            Process process = ();
            //脚本执行输出信息
            inputReader = new BufferedReader(new InputStreamReader(()));
            String str = null;
            while((str = ()) != null){
                (str);
            }
            //脚本执行异常时的输出信息
            errorReader = new BufferedReader(new InputStreamReader(()));
            String error = null;
            while((error = ()) != null){
                (error);
            }
            try {
                if (0 != ()) {
                    throw new Exception(("execute [%s] fail!(%s)", (" ", commands), errorString));
                }
            } catch (Exception e) {
                ();
            }
        } catch (IOException e) {
            ();
        } finally {
            try {
                if (inputReader != null) {
                    ();
                }
                if (errorReader != null) {
                    ();
                }
            }catch (Exception e){
                ();
            }
        }
        ("normal return:" + (returnString));
        ("error return:" + (errorString));
        return listMap;
    }
}

 当使用接口status参数时 最终执行的命令为  ./service status

输出结果是:

{
    "normal": [
        "service name: springbootdemo",
        "root     12862 12849  0 16:35 ?        00:00:00 grep springbootdemo",
        "root     54842     1  0 16:26 ?        00:00:00 -Dspringbootdemo -home /opt/hikvision/web/components/jre18linux64.1 -cwd /home/hik/app/springbootdemo -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=10086 -.preferIPv4Stack=true -=plain ssl -XX:MetaspaceSize=50M -XX:MaxMetaspaceSize=100M -Xms100M -Xmx200M -Xmn50M -XX:SurvivorRatio=8 -XX:NewRatio=3 -XX:+UseG1GC -XX:+PrintTenuringDistribution -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintAdaptiveSizePolicy -XX:+PrintHeapAtGC -XX:+DisableExplicitGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:/home/hik/app/springbootdemo/logs/ -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=8M -=/home/hik/app/springbootdemo/temp -=/home/hik/app/springbootdemo/lib/* -= -wait 60 -pidfile /home/hik/app/springbootdemo/temp/ -outfile /home/hik/app/springbootdemo/logs/ -errfile /home/hik/app/springbootdemo/logs/ -cp .:/opt/hikvision/web/components/jre18linux64.1/lib/:/opt/hikvision/web/components/jre18linux64.1/lib/:/home/hik/app/springbootdemo/config:/home/hik/app/springbootdemo/lib/* ",
        "root     54843 54842  9 16:26 ?        00:00:52 -Dspringbootdemo -home /opt/hikvision/web/components/jre18linux64.1 -cwd /home/hik/app/springbootdemo -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=10086 -.preferIPv4Stack=true -=plain ssl -XX:MetaspaceSize=50M -XX:MaxMetaspaceSize=100M -Xms100M -Xmx200M -Xmn50M -XX:SurvivorRatio=8 -XX:NewRatio=3 -XX:+UseG1GC -XX:+PrintTenuringDistribution -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintAdaptiveSizePolicy -XX:+PrintHeapAtGC -XX:+DisableExplicitGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:/home/hik/app/springbootdemo/logs/ -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=8M -=/home/hik/app/springbootdemo/temp -=/home/hik/app/springbootdemo/lib/* -= -wait 60 -pidfile /home/hik/app/springbootdemo/temp/ -outfile /home/hik/app/springbootdemo/logs/ -errfile /home/hik/app/springbootdemo/logs/ -cp .:/opt/hikvision/web/components/jre18linux64.1/lib/:/opt/hikvision/web/components/jre18linux64.1/lib/:/home/hik/app/springbootdemo/config:/home/hik/app/springbootdemo/lib/* "
    ],
    "error": []
}