分享

Java使用Runtime执行Linux命令用管理连接问题

 MMM_777 2013-11-01

Java具有使用Runtime.exec对本地程序调用进行重定向的能力,但是用重定向或者管道进行命令调用将会出错。

异常代码

当命令中含有管道(即命令符 | )的时候,就会出问题,无法获取相应的信息:

public static void getProcess() {
        String cmd = "ps aux|grep java";
        Process pro;
        BufferedReader br = null;
        try {
            pro = Runtime.getRuntime().exec(cmd);
            br = new BufferedReader(new InputStreamReader(pro.getInputStream()));
            for (String buf = br.readLine(); buf != null; buf = br.readLine()) {
                System.out.println(buf);
            }
        } catch (Exception ex) {
            logger.error("getProcess exception : " + ex.getMessage());
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException ex) {
                    logger.warn("bf close error" + ex.getMessage());
                }
            }
        }
    }

解决方案

解决方式很简单,用sh -c ,再加上原先的命令串即可解决问题:

public static void getProcess() {
        String cmd = "ps aux|grep java";
        String[] commands = new String[]{"sh", "-c", cmd};
        Process pro;
        BufferedReader br = null;
        try {
            pro = Runtime.getRuntime().exec(commands);
            br = new BufferedReader(new InputStreamReader(pro.getInputStream()));
            for (String buf = br.readLine(); buf != null; buf = br.readLine()) {
                System.out.println(buf);
            }
        } catch (Exception ex) {
            logger.error("getProcess exception : " + ex.getMessage());
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException ex) {
                    logger.warn("bf close error" + ex.getMessage());
                }
            }
        }
    }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多