Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当程序终止时,使用“exec”终止进程运行_Java_Python_Runtime.exec - Fatal编程技术网

Java 当程序终止时,使用“exec”终止进程运行

Java 当程序终止时,使用“exec”终止进程运行,java,python,runtime.exec,Java,Python,Runtime.exec,我有一个java程序,它作为一个进程运行另一个(Python)程序 Process p = Runtime.getRuntime().exec("program.py", envp); 如果java程序完成了处理,Python进程也完成了。finish命令向Python进程发送一个关闭它的信号 在正常情况下,流程通过以下方式关闭: BufferedWriter output = new BufferedWriter(new OutputStreamWriter(p.getOutputStrea

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

假设崩溃意味着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进程。在您的程序中处理它不那么复杂,甚至在程序完成后保留代码可能是一个好主意,因为您可能仍然有不知道的bug。

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

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

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

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

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


也许用这种方法?

我实际上也对这个问题的答案很感兴趣。虽然我不能提供,但您介意分享一下Java程序崩溃的原因吗?为了回答这个问题,您需要提供更多信息。例如:你是否可以随意修改Java和Python程序中的一个或两个的源代码?我不同意Vinay(哈哈,同名)。实际上,我现在正在查找它,但我认为,如果只在当前Java进程ID运行时运行python进程,就可以做到这一点。不确定我是否走上了正确的道路,但这个问题确实引起了我的兴趣。程序崩溃是因为它正在开发中,我希望最终版本不会崩溃;-)然而,当我测试程序时,它崩溃了,我不得不手动终止子进程,这很烦人;-)哈哈,我就是这么想的。我可能会遇到类似的情况,所以我很想弄清楚这一点。同时尝试查找一个while(PID)类型的循环。这是一场比赛“关闭挂钩也应快速完成其工作。当程序调用exit时,预期虚拟机将立即关闭并退出。当虚拟机因用户注销或系统关闭而终止时,底层操作系统可能只允许一段固定的时间关闭并退出。这是refore不建议尝试任何用户交互或在关机挂钩中执行长时间运行的计算。似乎是OP的完美解决方案(同时也熄灭了我的兴趣)这不是一个完美的解决方案,但在我的案例中,这种模式已经足够了。