zoukankan      html  css  js  c++  java
  • java执行系统命令, 返回执行结果

    package com.geostar.gfstack.opinion.util;
    
    import java.io.BufferedReader;
    import java.io.Closeable;
    import java.io.File;
    import java.io.InputStreamReader;
    
    /**
     * @author 王睿 <wangrui1066@geostar.com.cn>
     * @date 2019/5/17 9:40
     */
    public class DockerSockUtils {
    
        private static final String DOCKER_SOCK_CMD_PREFIX = "curl -s --unix-socket /var/run/docker.sock http://localhost/";
    
        public static void main(String[] args) {
            System.out.println(execDockerSockCmd("containers/json"));
        }
    
        /**
         * 通过docker套接字发送HTTP请求获取数据
         *
         * @param cmd
         * @return
         */
        public static String execDockerSockCmd(String cmd) {
            return execCmd(DOCKER_SOCK_CMD_PREFIX + cmd);
        }
    
        /**
         * 执行系统命令, 返回执行结果
         *
         * @param cmd 需要执行的命令
         * @return
         */
        public static String execCmd(String cmd) {
            return execCmd(cmd, null);
        }
    
        /**
         * 执行系统命令, 返回执行结果
         *
         * @param cmd 需要执行的命令
         * @param dir 执行命令的子进程的工作目录, null 表示和当前主进程工作目录相同
         */
        public static String execCmd(String cmd, File dir) {
            StringBuilder result = new StringBuilder();
            Process process = null;
            BufferedReader bufrIn = null;
            BufferedReader bufrError = null;
            try {
                String[] command = {"/bin/sh", "-c", cmd};
                // 执行命令, 返回一个子进程对象(命令在子进程中执行)
                process = Runtime.getRuntime().exec(command, null, dir);
                // 方法阻塞, 等待命令执行完成(成功会返回0)
                process.waitFor();
                // 获取命令执行结果, 有两个结果: 正常的输出 和 错误的输出(PS: 子进程的输出就是主进程的输入)
                bufrIn = new BufferedReader(new InputStreamReader(process.getInputStream(), "UTF-8"));
                bufrError = new BufferedReader(new InputStreamReader(process.getErrorStream(), "UTF-8"));
                // 读取输出
                String line;
                while ((line = bufrIn.readLine()) != null) {
                    result.append(line).append('
    ');
                }
                while ((line = bufrError.readLine()) != null) {
                    result.append(line).append('
    ');
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                closeStream(bufrIn);
                closeStream(bufrError);
                // 销毁子进程
                if (process != null) {
                    process.destroy();
                }
                // 返回执行结果
                return result.toString();
            }
        }
    
        /**
         * 关闭流
         *
         * @param stream
         */
        private static void closeStream(Closeable stream) {
            if (stream != null) {
                try {
                    stream.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
  • 相关阅读:
    缓存概述
    进程Process
    MVC系统过滤器、自定义过滤器
    暂无,进程那篇深度不够
    SeasLog 与 monolog 日志系统的区别,SeasLog安装步骤
    阿里面试官:说一下从url输入到返回请求的过程,问的难度就是不一样!
    [技术分享]OSI七层模型详解
    Mysql引擎介绍及InnoDB逻辑存储结构
    Paypal 实现自动订阅
    PayPal 支付Checkout 收银台和 Subscription 订阅计划全过程分享
  • 原文地址:https://www.cnblogs.com/nihaorz/p/10881738.html
Copyright © 2011-2022 走看看