zoukankan      html  css  js  c++  java
  • 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"; 
    

    结果如图:

  • 相关阅读:
    IS上部署MVC网站,打开后ExtensionlessUrlHandler-
    深拷贝与浅拷贝
    python小技巧---打印出不同颜色的输出
    环境搭建之allure的安装配置,及简单使用
    Python进行JSON格式化输出,以及汉字显示问题
    无限遍历,Python实现在多维嵌套字典、列表、元组的JSON中获取数据
    环境准备—之—linux下安装svn--开机自启--及format权限问题
    环境准备—之—linux下安装python3和pip3
    环境准备—之—linux下安装jdk
    问题1——之Linux虚拟机ip地址消失
  • 原文地址:https://www.cnblogs.com/d9e84208/p/15258080.html
Copyright © 2011-2022 走看看