Ответ 1
Способом справиться с этим было бы зарегистрировать shutdown. Если вы используете (SIGINT), то kill -2
приведет к изящному завершению программы и запуску крюков остановки.
Регистрирует новую виртуальную машину выключение крюка.
Виртуальная машина Java отключается ответ на два вида событий:
Программа завершается нормально, когда последний поток не-daemon выходит или когда вызывается метод exit (эквивалентно, System.exit) или
Виртуальная машина завершается в ответ на прерывание пользователя, например, набирает ^ C или общесистемное событие, такое как выключение пользователя или выключение системы.
Я попробовал следующую тестовую программу на OSX 10.6.3 и на kill -9
сделал НЕ запуск выключения, не думал, что это будет. На kill -15
он DOES запускает крюк выключения каждый раз.
public class TestShutdownHook
{
public static void main(final String[] args) throws InterruptedException
{
Runtime.getRuntime().addShutdownHook(new Thread()
{
@Override
public void run()
{
System.out.println("Shutdown hook ran!");
}
});
while (true)
{
Thread.sleep(1000);
}
}
}
Это документированный способ написать собственные обработчики сигналов которые не являются перехватами выключения на Java. Be предупредил, что пакеты com.sun.misc
не поддерживаются и могут быть изменены или удалены в любое время и, вероятно, существуют только в Sun JVM.