场景:
服务器中执行shell命令的时候,通过java调起的shell命令执行。
异常位置:
exitValue();在执行这个方法的时候,即获取执行结果的时候。
异常信息:
1、java.lang.IllegalThreadStateException: process hasn‘t exited。
2、exitValue() == 1 或者126
解决方案:
1、Thread.sleep(1000);在调用exitValue() 方法前。
2、在循序读取shell命令的输入时关闭流。
3、waitFor方法。该方法会一直阻塞直到shell命令执行进程完成,并返回执行结果。如果进程无法执行完成,waitFor方法将一直阻塞下去。
4、异常2中,主要是失败,解决方案,最直接的就是重试机制。
5、126错误,俩种情况,要么是sh文件权限不够,chmod就好。第二个就是sh本身就是有问题。可以从这俩个方面着手。
try(
Process pr = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", "sh test.sh"});
BufferedReader br = new BufferedReader(new InputStreamReader(pr.getInputStream()))
) {
String result;
while ((result = br.readLine()) != null) {
System.out.println(result);
}
br.close();
Thread.sleep(1000L);
// 返回 0: 成功 其他:失败
int value = pr.exitValue();
}catch(Exception e) {
}