啟動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();
}
}