繁体   English   中英

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

[英]Terminate process run with `exec` when program terminates

我有一个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程序崩溃时,进程不会关闭。 由于崩溃,不发送关闭命令。 是否可以在程序终止时自动终止进程?

嘿@czuk会对ShutdownHook挂钩有什么用吗? 这将处理以下方案

Java虚拟机关闭以响应两种事件:

  • 当最后一个非守护程序线程退出或调用退出(等效,System.exit)方法时,程序正常退出,或者

  • 响应于用户中断(例如,键入^ C)或系统范围的事件(例如用户注销或系统关闭),终止虚拟机。

当系统意外崩溃时,这并不容易捕获。

也许使用Thread.setDefaultUncaughtExceptionHandler方法?

假设崩溃意味着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()逃脱,那么这样的东西应该有效。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM