程序终止时用“exec”终止进程运行

2024-09-24 02:24:26 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Process p = Runtime.getRuntime().exec("program.py", envp);

如果java程序完成了处理,Python进程也就完成了。finish命令向Python进程发送关闭它的信号。在

在正常情况下,流程是这样关闭的:

^{pr2}$

但是,当java程序崩溃时,进程并不是关闭的。由于崩溃,未发送关闭命令。是否可以在每次程序终止时自动终止进程?在


Tags: py命令程序信号进程情况流程java
2条回答

嘿@czuk一个ShutdownHook钩子有用吗?这将处理以下场景

Java虚拟机会关闭以响应两种类型的事件:

  • 当最后一个非守护进程线程退出或退出时(相当于,系统出口)方法,或

  • 当用户中断(如键入^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脚本中更好,这样会在某种程度上杀死Python进程。在程序中处理它就不那么复杂了,甚至在程序完成后保留代码可能是个好主意,因为你可能仍然有一些你不知道的bug。在

相关问题 更多 >