最近写代码需要执行linux命令,对这块比较陌生,在摸索了网上资料以及项目里的前辈写的代码后,整理了一下快速上手的过程。(最新补充在最后)

主要使用到两个类Runtime和Process

//获取Runtime实例
Runtime rt = Runtime.getRuntime();
//command是字符串类型,为需要执行的linux命令
Process p = rt.exec(command);// 查看硬盘空间
//初始化缓冲阅读器
BufferedReader in = null;
//获取命令所得的缓冲流结果
in = new BufferedReader(new InputStreamReader(p.getInputStream()));
//此时就可以对获取的结果in进行操作了,可以使用in.readline()逐步获取每一行的结果内容

 举例一:

现在想要获取磁盘的空间使用情况,用到的命令是:df -h

Runtime rt = Runtime.getRuntime();
Process p = rt.exec("df -h");
BufferedReader in = null;
try {
    in = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String str = null;
    String[] strArray = null;
    //逐一对每行内容进行操作
    while ((str = in.readLine()) != null) {
            ……
            ……
    }
} catch (Exception e) {
    logger.info("there has an eror: ", e);
} finally {
    in.close();
}

举例二:

假如需要执行的命令里带有参数、管道等需要分隔成字符串数组进行执行

现在想要获取"/test"目录下的使用磁盘大小,需要使用到的命令:df -h|grep /test

Runtime rt = Runtime.getRuntime();
//分割成数组
String[] commands = {"/bin/sh","-c","df -hlT|grep \"/test\"};
Process p = rt.exec(commands);
BufferedReader in = null;
try {
    in = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String str = null;
    String[] strArray = null;
    while ((str = in.readLine()) != null) {
        ……
        ……
    }
} catch (Exception e) {
    logger.info("there has an eror: ", e);
} finally {
    in.close();
}

举例三:

假如需要执行的命令有两个,用&&连接,比如要先进入/opt/dmdbms/bin目录下执行dexp命令

需要使用到的命令是cd /opt/dmdbms/bin && ./dexp,直接以字符串形式传入exec()就行。

举例四:

最近又使用到了相关操作,通过以上两种方式,执行ffmpeg命令时,服务器上能执行成功的命令,用java执行老是报错什么no such file,网上搜了挺久也debug了挺久,最后直接使用ProcessBuilder发现就完全没问题了,推荐用以下方式执行命令

try {
    ProcessBuilder processBuilder = new ProcessBuilder(command);
    Process process = processBuilder.start();
    StringBuilder errorOutput = new StringBuilder();
    try (BufferedReader errorIn = new BufferedReader(new InputStreamReader(process.getErrorStream()))) {
        String str;
        //错误输出
        while ((str = errorIn.readLine()) != null) {
            errorOutput.append(str).append("\n");
        }
    }
    int exitCode = process.waitFor();
    // 检查命令执行结果
    if (exitCode == 0) {
        log.info("command executed successfully.");
        return false;
    }
    log.error("execute command '{}' failed, exit code: {}, error out : {}", command, exitCode, errorOutput);
} catch (Exception e) {
    log.error("execute command '{}' error!", command, e);
}

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐