我有一个java程序,它运行另一个(Python)程序作为进程。
Process p = Runtime.getRuntime().exec("program.py", envp);
如果java程序完成处理,Python进程也会完成。 finish
命令向Python进程发送信号以关闭它。
在正常情况下,过程以这种方式关闭:
BufferedWriter output = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
output.write("@EOF\n");
output.flush();
但是,当java程序崩溃时,进程不会关闭。由于崩溃,不发送关闭命令。是否可以在程序终止时自动终止进程?
答案 0 :(得分:3)
Java虚拟机关闭以响应两种事件:
当最后一个非守护程序线程退出或调用exit(等效,System.exit)方法时,程序正常退出,或者
虚拟机将响应用户中断(例如键入^ C)或系统范围的事件(例如用户注销或系统关闭)而终止。
当系统意外崩溃时,这并不容易捕获。
答案 1 :(得分:2)
假设崩溃意味着Java程序抛出异常,我会在发生这种情况时终止Python进程。我还没有看到你的代码,但是:
class Foo {
Process p;
private void doStuff() throws Exception {
p = Runtime.getRuntime().exec("program.py", envp);
// More code ...
}
private void startStuff() {
try {
doStuff();
} catch (Exception e) {
p.destroy();
}
}
public static void main(String[] args) {
Foo foo = new Foo();
foo.startStuff();
}
}
如果只有导致程序崩溃的异常从doStuff()
中逃脱,那么这样的事情应该有效。
即使你不希望程序在完成时以这种方式崩溃,我认为这种方法比将它包装在一个以某种方式杀死Python进程的shell脚本中更好。在程序中处理它不那么复杂,一旦程序完成后保留代码甚至可能是个好主意,因为你可能仍然有你不知道的错误。