当java进程终止时捕获

如何通过taskmanager或taskkill控制台命令来杀死我的应用程序(java,但并不重要),我该如何捕获?

我明白,我不能在我的应用程序中捕捉到这一点,但也许我可以通过与操作系统(当然是窗口)的一些钩子做到这一点。 也许easyhook库( http://www.codeplex.com/easyhook )可以帮助我,但是我在那找不到例子。 我们的应用程序经常死于客户服务器,我只想知道谁(或什么)杀死它。 我们确信这不是应用程序问题,似乎是java.exe进程从taskmanager中死亡

你可以这样做:

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

如果虚拟机崩溃在本地代码,这将不会被调用。 如果虚拟机暂停,它也不会被调用。 它并没有告诉你为什么它正在关闭。 请参阅关闭挂钩API的设计 。 我不认为你可以得到更多的信息。

过去我经常使用Java服务包装器 。 这是一个独立的进程,启动和重新启动Java进程,并记录来自它们的输出,如果异常意外地终止进程,这可能很有用。

您可以使用第二个将在本地机器上运行的应用程序,并监视您的主应用程序。 当主应用程序停机时,它可以做一些事情(例如,重新启动它,记录事件)

没有(标准的)方式来确定你的应用程序何时被任务管理器用Java杀死。

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

为了区分这两种情况,请检查子应用程序的输出,并查找当前目录中的VM崩溃转储(无论您的应用程序可能是什么,通常是安装应用程序的目录)。

你也可以通过使用两个应用程序简单地通过Java应用程序来完成。 这是如何在许多纯java产品系统中完成的

  1. 你的主应用程序将使.lock文件在一个标准的位置,并锁定它的排他性。
  2. 你的其他程序(也许称为看门人的应用程序)将继续进行锁定()调用,并继续等待。

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

    至于“为什么应用程序被杀死”的问题,在技术上你不能找出(可能是1或2场景,但不是所有场景),AFAIK。