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()); } } } } |
|