启动shell进程后,发现进程长时间运行无法结束,同时失去响应。这个问题的原因是shell脚本或者命令在运行的过程中会向标准输出或者标准错误输出写出数据,但JVM又没有去读,导致缓冲区满,进而导致进程阻塞。这个问题的解决的方法比较简单,既然问题是缓冲区满之后没有及时清理,那么只要在Java代码里去读一下数据,保证缓冲区不会满即可.
public static void executeCMD(final String cmdStrArr) {
Runtime rt = Runtime.getRuntime();
System.out.println("开始执行脚本");
System.out.println("脚本内容为:" + cmdStrArr);
try {
Process p = rt.exec(cmdStrArr);
// 防止缓冲区满, 导致卡住
new Thread() {
@Override
public void run() {
super.run();
String line;
try {
BufferedReader stderr = new BufferedReader(new InputStreamReader(p.getErrorStream()));
while ((line = stderr.readLine()) != null) {
System.out.println("stderr:" + line);
}
}
catch (Exception e) {
}
}
}.start();
new Thread() {
@Override
public void run() {
super.run();
String line;
try {
BufferedReader stdout = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = stdout.readLine()) != null) {
System.out.println("stdout:" + line);
}
}
catch (Exception e) {
}
}
}.start();
int exitVal = p.waitFor();
if (0 != exitVal) {
System.out.println("执行脚本失败");
}
System.out.println("执行脚本成功");
}
catch (Exception e) {
e.printStackTrace();
}
}