Java执行命令获取结果并超时退出
2015-06-05 17:48
1036 查看
最近做个功能,要用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();
}
}
/**
* 命令执行
* @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();
}
}
相关文章推荐
- JavaSript模块规范 - AMD规范与CMD规范介绍 (转)
- spring mvc
- Java for LeetCode 162 Find Peak Element
- eclipse 源码查看 jar包反编译神器 JD-jui
- JavaWeb项目中实现云巴推送
- Spring mvc4使用JSON包变更
- java版sqlhelper(转载)
- Java加密技术(一)单向加密算法MD5&SHA&MAC与BASE64
- java序列化/反序列化之xstream、protobuf、protostuff 的比较与使用例子
- java之合并链表的两种方法
- Windows下搭建Eclipse+Android4.0开发环境
- Java基础 异常-finally 包package
- 【Eclipse教程】 eclipse快捷键大全
- spring 的 AOP详解
- Spring 解决编码问题-CharacterEncodingFilter
- Java for LeetCode 160 Intersection of Two Linked Lists
- 简单页面下载实例
- Java中特殊的String
- Mac下修改Android Studio 所用的JDK版本
- javac命令和jar命令