Java执行shell

最近解锁了新技能,mark一下。

海豚调度器里面可以执行shell/python等脚本,但是这调度器本身是Java开发的,Java和Shell执行引擎是怎么交互的?翻了一下代码~

Java其实已经提供了相应的Process类和相应的API,使用者直接调用API即可。

下面是一个Demo:

ShellExecutor.java

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * @Description
 * @Date 2021/9/12
 * @Created by Jonathan
 */
public class ShellExecutor {
    private static void run() throws Exception {
        //Process process;
        List<String> command = new LinkedList<>();
        //init process builder
        ProcessBuilder processBuilder = new ProcessBuilder();
        // setting up a working directory
        processBuilder.directory(new File("/opt/"));
        // merge error information to standard output stream
        processBuilder.redirectErrorStream(true);

        // setting up user to run commands
        command.add("sudo");
        command.add("-u");
        command.add("root");
        command.add("sh");
        //command.addAll(commandOptions());
        command.add("/opt/test.sh");

        // setting commands
        processBuilder.command(command);
        Process process = processBuilder.start();
        // run 阻塞的
        boolean waitFor = process.waitFor(10, TimeUnit.SECONDS);
        System.out.println("status:" + waitFor);
        List<String> logBuffer = new ArrayList<>();
        BufferedReader inReader = null;
        try {

            inReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = inReader.readLine()) != null) {
                logBuffer.add(line);
            }
        } catch (Exception e) {
            System.out.println("error.");
        }
        System.out.println("logBuffer:" + logBuffer);
    }

    public static void main(String[] args) throws Exception {
        System.out.println("start run shell");
        run();
        System.out.println("end run shell");
    }
}

上面这个代码看起来也很直白,就是初始化了一个Process类,入参就是指定以什么用户身份去执行指定路径的shell脚本,在获取shell执行之后的运行结果。

test.sh

#!/bin/bash 
time1=$(date); 
echo $time1; 
echo "hello world-2021-09-12"; 

结果如图:

原文地址:https://www.cnblogs.com/d9e84208/p/15258080.html