要用java执行命令,需要获取结果,同时也要求命令执行只能在一个固定的时间内结束,否则就应该超时退出。
查找了很多资料了,有用定时器的、有创建线程监测的,有循环执行的,但是最后结果都不尽人意。最后还是自己研究了一个。
// 执行命令cmdStr timeOut超时时长 单位:秒
private void execCommand(String cmdStr,long timeOut){
try {
long start = System.currentTimeMillis() / 1000;
Process p = Runtime.getRuntime().exec(cmdStr);
// waitFor(time,unit) 相当于 每time /unit 获取一次 Process的执行结果,
// 当没有执行完成 结果为false,执行结束:true
// 下面代码是while每1秒获取1次 p的执行结果。 。
while (!p.waitFor(1, TimeUnit.SECONDS)) {
if (System.currentTimeMillis() / 1000 - start > timeOut) {
log.error("命令:{},计算超时!!!",cmdStr);
p.destroy();
break;
}
}
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream(), "GBK"));
BufferedReader errBr = new BufferedReader(new InputStreamReader(p.getErrorStream()));
String line = "";
while ((line = br.readLine()) != null) {
log.info(line);
}
while ((line = errBr.readLine()) != null) {
log.error(line);
}
br.close();
errBr.close();
p.getErrorStream().close();
p.getInputStream().close();
p.destroy();
}catch (Exception e) {
log.error("启动命令失败");
}
}