在使用Runtime.getRuntime有时候会出现僵死的情况。
public static boolean runRuby(String cmd) throws IOException {
cmd = "ruby ./config/data/script/" + cmd;
logger.info("开始执行ruby 脚本:" + cmd);
proc = runtime.exec(cmd);
String buffer;
InputStream pin = proc.getInputStream();
InputStreamReader cin = new InputStreamReader(pin);
BufferedReader in = new BufferedReader(cin);
buffer = in.readLine();
logger.info(buffer);
try {
buffer = in.readLine();
while (buffer != null) {
logger.info(buffer);
buffer = in.readLine();
}
in.close();
} catch (IOException e) {
logger.error("进程出错", e);
e.printStackTrace();
}
try {
if (proc.waitFor() != 0) {
logger.error("ruby 脚本:" + cmd + " 执行失败。");
logger.error("Exit Code= " + proc.exitValue());
return false;
} else {
logger.info("ruby 脚本:" + cmd + " 执行成功。");
return true;
}
} catch (InterruptedException e) {
logger.error(e);
return false;
}
}
原因是: InputStream pin = proc.getInputStream();得到是正常的输入流,而如果系统命令里面报错,就会获取不到输入流
所以需要改成InputStream pin = proc.getErrorStream();
这样就可以获取错误的输出流,进程才可以继续运行下去!