【问题标题】:Terminate process run with `exec` when program terminates程序终止时使用 exec 终止进程运行
【发布时间】:2011-05-13 07:25:37
【问题描述】:

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

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 程序崩溃的原因吗?
  • 为了回答这个问题,您需要提供更多信息。例如:您是否可以随意修改 Java 和 Python 程序中的一个或两个的源代码?
  • 我不得不不同意 Vinay(哈哈,同名)。实际上,我现在正在查找它,但我认为仅在当前 Java 进程 ID 运行时运行该 python 进程的方法可以解决问题。不确定我是否走在正确的道路上,但这个问题确实让我很感兴趣。
  • 程序崩溃是因为它正在开发中,我希望最终版本不会崩溃;-) 但是,当我测试程序并且它崩溃时,我必须手动终止子进程,什么是相当烦人的;-)
  • 哈哈,我就是这么想的。我可能会在路上遇到类似的情况,所以我真的很想弄清楚这一点。尝试同时查找一个 while(PID) 循环。这是一场比赛。 ;-)

标签: java python runtime.exec


【解决方案1】:

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

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

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

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

当系统意外崩溃时,这不是那么容易捕获的。

也许使用Thread.setDefaultUncaughtExceptionHandler 方法?

【讨论】:

  • "关闭钩子也应该很快完成它们的工作。当程序调用 exit 时,期望虚拟机会立即关闭并退出。当虚拟机由于用户注销或系统关闭而终止时底层操作系统可能只允许关闭和退出的固定时间。因此,不建议尝试任何用户交互或在关闭挂钩中执行长时间运行的计算。杀死一个 Python 进程不需要很长时间。似乎是 OP 的完美解决方案(并激发了我的兴趣)。 :)
【解决方案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 脚本中更好。在您的程序中处理它不太复杂,甚至在程序完成后保留代码甚至可能是一个好主意,因为您可能仍然有您不知道的错误。

【讨论】:

  • 这不是一个完美的解决方案,但在我的情况下这种模式就足够了。
猜你喜欢
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 2014-05-01
  • 1970-01-01
  • 2012-08-20
  • 2014-12-06
相关资源
最近更新 更多