Как определить, что закрывает мое приложение Java? - PullRequest
5 голосов
/ 19 марта 2020

У меня есть приложение Java8, работающее на RHEL 6.10. Это приложение регистрирует обработчик выключения обычным способом:

Thread shutdownThread = new Thread(()=>{
   Logger.info("Got shutdown signal");
   // Do cleanup
});
Runtime.getRuntime().addShutdownHook(shutdownThread);

Это приложение запускается сборкой Jenkins (с BUILD_ID env var, установленным в dontkillme). Приложение успешно инициализируется, но затем через ~ 30 секунд вызывается ловушка завершения работы, и приложение завершается. Я пытаюсь выяснить, кто меня закрывает и почему. Я наблюдал за top и не похоже, что память - это проблема во время работы, поэтому я не думаю, что убийца OOM является виновником. Я также посмотрел на /var/log/dmesg и /var/log/messages и не вижу там ничего релевантного. Я не думаю, что Дженкинс убил бы меня, так как я установил BUILD_ID, а также потому, что приложение умирает, пока «родительское» задание Дженкинса все еще выполняется.

Какие еще методы / инструменты я могу использовать, чтобы увидеть, что происходит? Обратите внимание, что моя среда очень заблокирована, поэтому было бы сложно скачать и запустить что-нибудь из inte rnet, надеюсь, что в стандартной установке RHEL6 есть что-то, что я мог бы использовать.

1 Ответ

0 голосов
/ 23 марта 2020

Ответ оказался уникальным для рассматриваемой заявки. Приложение использует библиотеку zookeeper-3.5.5 для подключения к экземпляру Zookeeper. Эта клиентская библиотека имеет зависимость во время выполнения от jar zookeeper-jute, и когда этот jar отсутствовал в исполняющем каталоге, эта проблема возникла сама собой.

Вы, вероятно, задаетесь вопросом, почему приложение молча закрыло себя и не выдал ClassNotFoundException, который помог бы мне отладить это. Отличный вопрос! Понятия не имею.

...