当命令中含有管道(即命令符 | )的时候,使用命令的时候可以获取值,但是使用程序得到的就是空。
解决方式很简单,用sh -c ,再加上原先的命令串即可解决问题:
Process ps = Runtime.getRuntime().exec(new String[]{"sh", "-c", cpCommander}); BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream())); StringBuffer sb = new StringBuffer(); String line; while ((line = br.readLine()) != null) { sb.append(line).append("\n"); } String result = sb.toString(); log.info("@@##进程结果:"+result); // 将获取结果去除回车拆分 String[] resultStr = result.split("\n"); for (int j = 0; j < resultStr.length - 1; j++) { String s = resultStr[j + 1]; // 去除tab键 s = s.replace(" ", " "); // 将所有的多空格转成单空格 s = s.replaceAll(" +", " "); if (s.startsWith(" ")) { // 将第一个空格截取去除 s = s.substring(1, s.length()); } // 将数据以空格拆分:root 2737 1 0 Feb05 ? 00:00:00 /usr/sbin/acpid String[] retStr = s.split(" "); // 获取cp进程结果的最后一个数据(所下达的指令为何) String cmdCommander = retStr[7]; log.info("logCode+cp进程结果的最后一个数据,即cp指令:"+cmdCommander); log.info("fileName:"+fileName); log.info(logCode+"pid为:"+retStr[1]); if(cmdCommander.contains(fileName)){ log.info(logCode+"cp进程结果的最后一个数据,即cp指令包含文件名称。"); // 包含文件名,说明这个进程为要杀死的cp进程。获取进程的pid(第二个数据)。 String pid = retStr[1]; log.info(logCode+"pid为:"+pid); // 获取cp进程的标识号,拼接杀进程指令kill -9 进程标识号 String killCommander = "kill -9 " + pid; // 执行杀进程指令 log.info(logCode+"---开始执行kill指令:"+killCommander); Runtime.getRuntime().exec(killCommander); log.info(logCode+"---执行kill指令完毕。"); } } // 然后执行删除异常文件的指令 log.info(logCode+"---开始执行rm指令:"+rmCommander); Runtime.getRuntime().exec(rmCommander).waitFor(); log.info(logCode+"---执行rm指令完毕。"); |
带有管道或重定向的命令就会出错。如果带有参数就要把命令分割成数组或者List传入,不然会被当成一个整体执行(会出错,比如执行"ps -e")。对于|,<,>号来说,这样做也不行。对于Linux系统,解决方法就是把整个命令都当成sh的参数传入,用sh来执行命令。Windows下把sh换成cmd.exe就行了。
参考的另一种方式:
|