Runtime.getRuntime().exec(cmds, envp, null);
suProc = Runtime.getRuntime().exec(cmds, envp, null);
proc.exitValue()是非阻塞的,如果进程没有结束,就会抛出异常。解决办法是循环等待命令退出
while(true){
try {
int exitValue=proc.exitValue();
return exitValue;
} catch (Exception e) {
Thread.currentThread().sleep(500);
}
}
如果调用子进程结束,系统将关闭输出流和错误流。用户程序通过判断是否为-1知道是否结束。
但是java调用cli时,cli启动了子进程,子进程为dhcp的客户端守护进程,负责与dhcp服务器通信,这个子进程不关闭,所以父进程也不关闭,造成系统不能关闭输出流和错误流,最后java线程阻塞。
解决办法是和相关人员确定一个特殊结束字符字符,我们这个特殊字符为转化为int后为:165
private static String loadErrorStream(Process proc) throws IOException {
InputStream in = new BufferedInputStream(proc.getErrorStream());
StringBuffer buffer = new StringBuffer();
int ptr = 0;
while ((ptr = in.read()) != 165 ){
buffer.append((char) ptr);
}
return buffer.toString();
}
另一种场景:
调用的命令,需要执行20分钟,不想等待,要立即返回。
那么可以异步执行