Поймать, когда Java-процесс был прекращен - PullRequest
4 голосов
/ 11 января 2010

Как я могу поймать, когда кто-то убивает мое приложение (Java, но это не важно) с помощью taskmanager или консольной команды taskkill?

Я понимаю, что я не могу поймать это в моем приложении, но, возможно, я могу сделать это каким-то образом с ОС (конечно, Windows). Может быть, библиотека easyhook (http://www.codeplex.com/easyhook) может мне помочь, но я не могу найти там примеров. Наше приложение часто умирало на клиентских серверах, и я просто хочу знать, кто (или что) его убивает. Мы уверены, что это не проблема приложения, похоже, процесс java.exe был убит из taskmanager

Ответы [ 4 ]

2 голосов
/ 11 января 2010

Вы можете сделать это:

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

Если виртуальная машина падает в собственном коде, это не будет вызвано. Он также не будет вызван, если виртуальная машина остановлена. Он также не говорит вам, почему он отключается. См. Конструкция API-интерфейса для выключателей . Я не думаю, что вы можете получить больше информации, чем это.

Часто в прошлом я использовал Java Service Wrapper . Это отдельный процесс, который запускает и перезапускает процессы Java и регистрирует выходные данные из них, что может быть полезно, если исключения неожиданно завершают процесс.

1 голос
/ 11 января 2010

Вы можете сделать это просто с помощью Java-приложения, используя два приложения. Вот как это делается во многих чистых Java-системах производства

  1. Ваше основное приложение создаст файл .lock в стандартном месте и заблокировать его исключительно.
  2. Ваша другая программа (возможно, назовите ее уборщик приложение) будет продолжать делать блокировку () позвони и продолжай ждать.

  3. Когда вызов блокировки возвращается, вы можете убедитесь, что ваше основное приложение прекращается. Теперь вы можете определить.

    Что касается вопроса "Почему приложение убито", технически вы не можете выяснить (может быть, 1 или 2 сценария, но не все сценарии), AFAIK.

0 голосов
/ 11 января 2010

Не существует (стандартного) способа выяснить, когда ваше приложение уничтожается диспетчером задач с Java.

Обычный подход состоит в том, чтобы иметь второе приложение, которое запускает основное приложение как дочерний процесс (используйте ProcessBuilder). Оболочка заметит, когда ребенок умрет. По всем обычным причинам прекращения действия установите код выхода через System.exit() в своем основном приложении. В вашей обертке проверьте код выхода. Если это не тот, который вы явно указали, то кто-то убил приложение или оно зависло из-за ошибки ВМ.

Чтобы различать эти два, проверьте выходные данные дочернего приложения и найдите дампы аварийного отказа виртуальной машины в текущем каталоге (что бы это ни было для вашего приложения; обычно это каталог, в котором было установлено ваше приложение).

0 голосов
/ 11 января 2010

вы можете использовать второе приложение, которое будет работать на локальном компьютере и контролировать ваше основное приложение. когда основное приложение закрывается, оно может что-то сделать (например, перезапустить его, записать событие) c

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...