Есть ли способ закрыть приложение Java по идентификатору процесса?

У меня есть приложение Java, работающее на сервере Linux. Когда он запустился, он записал идентификатор процесса в «pidfile».

Когда я его закрываю, я просто читаю pid из этого файла и уничтожаю его:

kill -9 12345

Но другие люди говорят, что это небезопасно, вместо этого они предлагают мне встроить небольшой http-сервер и предоставить http API для закрытия, например:

http://localhost:8080/close

Когда я хочу закрыть его, мне нужно посетить его:

curl http://localhost:8080/close

Это работает, но очень скучно, я все еще предпочитаю способ «идентификатора процесса». Есть ли способ использовать идентификатор процесса для безопасного закрытия приложения?


Обновлять:

«Безопасно» здесь я имею в виду, что могу отменить некоторые запущенные задачи, которые могут записывать файлы на диск, и закрыть некоторые ресурсы перед выходом.


person Freewind    schedule 15.11.2013    source источник
comment
Зависит от того, что вы подразумеваете под безопасным? Я предполагаю, что люди говорят, что это позволяет процессу Java очищать и закрывать ресурсы, но если это не имеет значения для вас, то не беспокойтесь (хотя kill -HUP может быть немного лучше...)   -  person Anders R. Bystrup    schedule 15.11.2013
comment
@ AndersR.Bystrup Спасибо, я только что обновил свой вопрос.   -  person Freewind    schedule 15.11.2013


Ответы (1)


Вы можете закрыть его, выполнив команду kill -HUP processId.

Если есть необходимость изящно завершить работу, зарегистрируйте хук завершения работы и выполните там всю необходимую финализацию.

Подробнее здесь Runtime.addShutdownHook

P.S: На мой взгляд, не вставляйте веб-сервер только для этой цели, если он вам не очень нужен. И если вы используете веб-сервер, вам также нужно подумать о безопасности — любой, кто знает URL-адрес, может удаленно закрыть ваше приложение :)

person Vasyl Keretsman    schedule 15.11.2013
comment
Перехватчики выключения обсуждались в соответствующем посте: stackoverflow .com/questions/191215/ - person Axel Kemper; 15.11.2013
comment
Я вижу, что в некоторых документах говорится, что kill -HUP означает перезапуск приложения. Но я не хочу, чтобы он перезапускался, просто закройте его. Я ничего не понимаю? - person Freewind; 15.11.2013
comment
Приложение может делать произвольные действия в качестве реакции на сигнал, который не убивает его сразу. HUP расшифровывается как зависание, т.е. соединение с пользователем потеряно. Обычно это приводит к изящному выходу. Сигналы объясняются здесь: en.wikipedia.org/wiki/Unix_signal - person Axel Kemper; 15.11.2013
comment
@Freewind, просто чтобы добавить немного к тому, что сказал Аксель - ваше приложение получает сигнал KILL и реагирует на него - в вашем случае отмените некоторые запущенные задачи, которые могут записывать файлы на диск, и закройте некоторые ресурсы перед выходом и завершением. - person Vasyl Keretsman; 15.11.2013