gpt4 book ai didi

java - 如何检测 Java 中的外部进程崩溃?

转载 作者:搜寻专家 更新时间:2023-11-01 03:51:41 25 4
gpt4 key购买 nike

我正在开发一个需要启动进程并等待其输出的应用程序。有时进程崩溃(非常频繁),但这并不是真正的问题,因为我有缓解任务。问题是 Windows 检测到进程崩溃并提示用户输入,以在线检查解决方案或关闭程序。

The dialog

我试图通过等待进程在提交给 ExecutorServiceRunnable 中完成并使用返回的 Future 来解决这个问题超时。速度并不是应用程序真正关心的问题,外部进程应该只运行几秒钟。

这是我使用的代码:

    final Process process = ...
final ExecutorService service = Executors.newSingleThreadExecutor();
try {
final Future<?> future = service.submit(new Runnable() {
@Override
public void run() {
try {
process.waitFor();
} catch (InterruptedException e) { /* error handling */}
}
});
future.get(10, TimeUnit.SECONDS);
} catch (final TimeoutException e) {
// The process may have crashed
process.destroy();
} catch (final Exception e) {
// error handling
} finally {
service.shutdown();
}

上面的代码运行良好,但崩溃对话框仍然弹出,并且在没有用户交互的情况下不会消失。

This question提出了类似的问题,但从 .Net 的角度来看,建议通过 Windows 注册表抑制弹出窗口,我不能这样做,因为它对机器中的所有进程都是全局的。

  • 有没有办法完全阻止对话框显示?

  • 有没有办法检测应用程序崩溃并直接处理从 Java 无需用户交互?

其他详细信息:

  • 我没有外部过程的来源。
  • 外部进程是一个基于控制台的应用程序(即没有 GUI。)
  • 最好是我正在寻找一个纯基于 Java 的解决方案(没有 JNI。)

谢谢。

最佳答案

如前所述,您应该使用 SetErrorMode win32 调用。它不会改变整个系统,只会改变你的进程和它的 child (这显然是你想要的)。正确的调用似乎是:

SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);

另请参阅 MSDN 文档: http://msdn.microsoft.com/en-us/library/windows/desktop/ms680621%28v=vs.85%29.aspx

问候。

关于java - 如何检测 Java 中的外部进程崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25706794/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com