• java 远程执行服务器命令工具,jsch,hutool,统计磁盘io占用情况,管道命令不执行情况处理


    //单条命令执行,iostat -x|awk -F ' ' '{print $2}' 这条语句,下面方法不会执行awk命令,报错了
    //该方法是hutool提供的
    String str = RuntimeUtil.execForStr("ipconfig");

    //这样处理可以支持管道命令不生效的问题
    String[] command ={"/bin/sh", "-c", "iostat -x | awk -F ' ' '$14>0' | awk '{print $14}'"};
    String res = RuntimeUtil.execForStr(command);
    //如果不成功,肯能是服务器不支持命令

    //hutool依赖
    <dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.12</version>
    </dependency>


    /**
    * 执行系统命令
    *
    * @param CMD 命令
    * @return 字符串结果
    */
    private static String runCommand(String CMD) {
    StringBuilder info = new StringBuilder();
    try {
    Process pos = Runtime.getRuntime().exec(CMD);
    pos.waitFor();
    InputStreamReader isr = new InputStreamReader(pos.getInputStream());
    LineNumberReader lnr = new LineNumberReader(isr);
    String line;
    while ((line = lnr.readLine()) != null) {
    info.append(line).append("\n");
    }
    } catch (Exception e) {
    info = new StringBuilder(e.toString());
    }
    return info.toString();
    }

    //上面的方法同样只能支持单挑命令的执行,复合命令执行不出结果

    添加依赖
    <dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.55</version>
    </dependency>
    <dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.12</version>
    </dependency>
    /**
    * @author Lazar
    * @description : 远程执行命令工具
    * @date 2022/1/20 16:22
    **/
    public static final String getConnect(String sshHost, String sshUser, String sshPass, String cmd) {
    Session session = JschUtil.getSession(sshHost, PORT, sshUser, sshPass);
    String exec = JschUtil.exec(session, cmd, CharsetUtil.CHARSET_UTF_8);
    JschUtil.close(session);
    return exec;
    }
    下面这个方法可以远程执行复合命令,返回执行后的信息
    例如
    iostat -x | awk -F ' ' '$14>0' | awk '{print $14}' 该命令统计磁盘io的占用情况
    //返回结果单位是1/10000
    public static long getDiskIoRatio() {
    log.info("主机磁盘io信息");
    double total = 0;
    String num;
    try {
    String resultInfo = getConnect(IP, USER, PASSWD, ioCmdStr);
    log.info("磁盘信息统计结果:{}", resultInfo);
    String[] split = resultInfo.split("\n");
    List<String> list = Arrays.asList(split);
    log.info("统计数组:{}", JSONObject.toJSON(list));
    double[] toArray = list.stream().mapToDouble(s -> {
    return Double.parseDouble(s);
    }).toArray();
    total = Arrays.stream(toArray).sum();
    } catch (NumberFormatException e) {
    total = 0;
    }
    log.info("使用率: " + total + "%");
    return Math.round(total * 10000);
    }
  • 相关阅读:
    retain assign copy (unsigned long)
    myeclipse未设置断点,但不断跳出debug
    SOAP tomcat7.0 HelloWorld
    JAVA第二天数据类型和循环
    java中产生随机数的几种方法
    java的第一个程序 Hello World
    java中产生随机数的几种方法
    用加减来简单的看策略类
    用加减来简单的看策略类
    奇数阶幻方
  • 原文地址:https://www.cnblogs.com/lalalazar/p/15826886.html
Copyright © 2020-2023  润新知