Восстановление / Перезапуск Java-демона после сбоя - PullRequest
3 голосов
/ 30 марта 2010

Я запускаю java-приложение в качестве демона на машине с Linux, используя настроенный сценарий оболочки.

Поскольку я новичок в java и linux, я хочу знать, возможно ли, что само приложение возрождается (как перезапуск) и восстанавливается после таких случаев, как сбой приложения, необработанные исключения или нехватка памяти и т. Д.

заранее спасибо

Ашиш Шарма

Ответы [ 5 ]

3 голосов
/ 30 марта 2010

JVM предназначена для смерти в случае неисправимой ошибки. Те, что вы описали, попадают в эту категорию.

Однако вы могли бы легко написать сценарий оболочки или сценарий Python, который проверяет, является ли процесс живым, и, если он мертв, ждет несколько секунд и восстанавливает его. В качестве подсказки для этого команда Unix «pgrep» - ваш друг, так как вы можете проверить точную командную строку, используемую для запуска JVM (и, следовательно, включая файл начального класса). Таким образом, вы можете определить, работает ли этот конкретный экземпляр JVM, и перезапустить его.

С учетом всего вышесказанного, вы можете захотеть добавить некоторые возможности отчетности или ведения журналов и проверять, если часто, потому что слишком легко предположить, что все в порядке, когда на самом деле демон умирает каждые несколько минут. Убедитесь, что вы сделали все возможное, чтобы не дать ему умереть, прежде чем воскресить его.

3 голосов
/ 30 марта 2010

Есть Wrappers, которые могут справиться с этим, например Java Service Wrapper (Учтите, что Community Edition выпускается под лицензией GPL) и некоторые альтернативы, упомянутые здесь

2 голосов
/ 30 марта 2010

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

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

В любом случае, если у вас есть очень веские причины для этого, решение, даже более простое, чем «проверка того, что процесс активен» (поскольку оно, вероятно, каким-то образом связано с некоторыми вещами «ps -blahblah»), вы можете просто java-программа запускается в цикле "while true" оболочки следующим образом:

while true
do
  # launch the java program here, no background
  # when crashing, the shell will be given hand back
  java -classpath blahblah...
  echo "program crashed, relaunching it..."
done
2 голосов
/ 30 марта 2010

В системах на основе Unix вы можете использовать "inittab", чтобы указать программу. Если процесс умирает, он перезапускается ОС. (Респаун)

1 голос
/ 30 марта 2010

Я не уверен, может ли само приложение справиться с такими сбоями. Вы можете написать сценарий оболочки в linux, который может быть запущен как само задание cron для управления приложением, проверяя, выполняется ли приложение java с запланированными интервалами, и если нет, оно автоматически перезапускает его.

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