Java执行命令获取结果并超时退出

来源:互联网 发布:凯旋软件 编辑:程序博客网 时间:2024/04/30 16:27

最近做个功能,要用java执行命令,需要获取结果,同时也要求命令执行只能在一个固定的时间内结束,否则就应该超时退出。我想这个功能网上应该一大把吧,没必要自已写,就随便搜了一下,找到一个csdn的,下载还要三分。三分就三分吧,下来一看,居然是再起一个线程去监视执行线程。靠,浪费老子三分。干脆自已看了看api,自已搞。以下是我的实现,有需要的同学可以参考:

/** * 命令执行 * @param cmd * @param envs * @param timeout * @return */private String execCMD(String cmd, String[] envs, int timeout) {Process process = null;StringBuilder sbStd = new StringBuilder();StringBuilder sbErr = new StringBuilder();long start = System.currentTimeMillis() / 1000;try {if (envs == null) {process = Runtime.getRuntime().exec(cmd);} else {process = Runtime.getRuntime().exec(new String[] { "/bin/sh", "-c", cmd }, envs);}BufferedReader brStd = new BufferedReader(new InputStreamReader(process.getInputStream()));BufferedReader brErr = new BufferedReader(new InputStreamReader(process.getErrorStream()));String line = null;while (true) {if (brStd.ready()) {line = brStd.readLine();sbStd.append(line + "\n");continue;} if (brErr.ready()) {line = brErr.readLine();sbErr.append(line + "\n");continue;} if (process != null) {try {                       process.exitValue();                       break;                } catch (IllegalThreadStateException e) {                   }   }if (System.currentTimeMillis() / 1000 - start > timeout) {sbErr.append("\n命令执行超时退出.");break;}try {TimeUnit.MILLISECONDS.sleep(500);} catch (InterruptedException e) {}}} catch (IOException e) {} finally {if (process != null) {process.destroy();}}if (sbErr.length()>0) {return sbErr.toString();} else {return sbStd.toString();}}



0 0