今天遇到个诡异的问题:用jsp运行一个shell脚本sh1,等待sh1推出后,销毁Process实例;sh1的工作是后台运行sh2,运行的方式: sh2 &。
产生的现象是sh2中只有前半部分会生效,而sh2的结构非常简单,中间根本没有会中途退出的语句。
经过试验后,发现问题其实出在后台运行上,一方面,java的进程控制会更加严格,如果销毁process实例的时候,所有后台运行的脚本也会被杀死。这样,当sh2的前半部分完成前,sh1已经退出,接着java虚拟机销毁了所有的相关进程,sh2就不能完整执行了。
java虚拟机启动脚本的方式跟直接运行脚本是不一样的,直接运行的时候,外层脚本退出,后台脚本会必成孤儿进程独立存在。
java代码如下:
public int runScript(String[] script) throws IOException {
Process proc = null;
int rv = -1;
try {
proc = Runtime.getRuntime().exec(script);
rv = proc.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
System.err.println("[FATAL]No Situation Allowed!!!"
+ e.getMessage());
} finally {
if (proc != null) {
proc.destroy();
proc = null;
}
}
return rv;
}