程序终止时,用`exec`终止进程运行

czu*_*zuk 7 python java runtime.exec

我有一个java程序,它运行另一个(Python)程序作为进程.

Process p = Runtime.getRuntime().exec("program.py", envp);
Run Code Online (Sandbox Code Playgroud)

如果java程序完成处理,Python进程也会完成.该finish命令向Python进程发送一个信号以关闭它.

在正常情况下,该过程以这种方式关闭:

BufferedWriter output = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
output.write("@EOF\n");
output.flush();
Run Code Online (Sandbox Code Playgroud)

但是,当java程序崩溃时,进程不会关闭.由于崩溃,不发送关闭命令.是否可以在程序终止时自动终止进程?

Arl*_*ren 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果只有导致程序崩溃的异常从doStuff().

即使您不希望程序在完成时以这种方式崩溃,我认为这种方法也比将其包装在 shell 脚本中更好,从而以某种方式杀死 Python 进程。在程序中处理它并不那么复杂,甚至在程序完成后保留代码可能是一个好主意,因为您可能仍然存在您不知道的错误。