Java进程终止时捕获

时间:2010-01-11 08:10:39

标签: java windows

当有人通过taskmanager或taskkill控制台命令杀死我的应用程序(java,但这并不重要)时,我怎么能抓住?

据我所知,我无法在我的应用程序中找到它,但也许我可以通过操作系统(当然是Windows)来实现这一点。也许easyhook库(http://www.codeplex.com/easyhook)可以帮助我,但我找不到那里的例子。 我们的应用程序经常死在客户服务器上,我只想知道谁(或什么)杀了它。我们确定它不是应用程序问题,似乎java.exe进程是从taskmanager中杀死的

4 个答案:

答案 0 :(得分:2)

你可以这样做:

Runtime.getRuntime().addShutdownHook(new Thread() {
  public void run() {
    // run some code
  }
});

如果VM在本机代码中崩溃,则不会调用此方法。如果VM停止,它也不会被调用。它没有告诉你为什么它也会关闭。见Design of the Shutdown Hooks API。我认为你不能获得更多的信息。

过去我经常使用Java Service Wrapper。它是一个单独的进程,用于启动和重新启动Java进程,并记录它们的输出,如果异常意外地终止进程,这将非常有用。

答案 1 :(得分:1)

通过使用两个应用程序,您也可以通过Java应用程序完成。这就是在许多纯java生产系统中完成它的方式

  1. 您的主应用程序将生成.lock文件 在标准的位置并锁定它 独占。
  2. 您的其他程序(也许可以调用它 看门人app)将继续做一个锁() 打电话给它,继续等待。

  3. 当锁定调用返回时,您可以 确保你的主应用程序是 终止。现在你可以确定。

    至于“为什么应用程序被杀”问题,从技术上讲,你无法找到(可能是1或2个场景,但不是所有场景),AFAIK。

答案 2 :(得分:0)

您可以使用将在本地计算机上运行的第二个应用程序并监视您的主应用程序。 当主应用程序发生故障时,它可以执行某些操作(例如重新启动它,记录事件)c

答案 3 :(得分:0)

没有(标准)方法可以确定应用程序被Java任务管理器杀死的时间。

通常的方法是使用第二个应用程序将主应用程序作为子进程启动(使用ProcessBuilder)。当孩子死亡时,包装将注意到。出于所有常见的终止原因,请在主应用中通过System.exit()设置退出代码。在您的包装器中,检查退出代码。如果它不是您明确设置的那个,那么有人杀死了应用程序,或者因为VM错误而崩溃。

要区分这两者,请检查子应用程序的输出,并在当前目录中查找VM崩溃转储(无论您的应用程序是什么;通常是安装应用程序的目录)。