Има ли някакъв начин да затворите Java приложение чрез идентификатор на процес?

Имам Java приложение, работещо на linux сървър. Когато стартира, той записва идентификатора на процеса в "pidfile".

Когато го затворя, просто чета pid от този файл и го убивам:

kill -9 12345

Но други хора казват, че не е безопасно, вместо това ми предлагат да вградя малък http сървър и да осигуря http api за затваряне, като например:

http://localhost:8080/close

Когато искам да го затворя, трябва да го посетя:

curl http://localhost:8080/close

Работи, но е много скучно, все още предпочитам начина "id на процеса". Има ли някакъв начин да използвате идентификатора на процеса за безопасно затваряне на приложението?


Актуализация:

„Безопасно“ тук имам предвид, че мога да отменя някои изпълнявани задачи, които могат да записват файлове на диск и да затворя някои ресурси, преди да изляза.


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