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"; 

结果如图:

posted @   Jonathan1  阅读(679)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示