Es ist für jedes Programm in jeder Sprache unmöglich , mit einem SIGKILL umzugehen. Auf diese Weise ist es immer möglich, ein Programm zu beenden, auch wenn das Programm fehlerhaft oder böswillig ist. SIGKILL ist jedoch nicht das einzige Mittel, um ein Programm zu beenden. Das andere ist, ein SIGTERM zu verwenden. Programme können dieses Signal verarbeiten. Das Programm sollte das Signal durch kontrolliertes, aber schnelles Herunterfahren verarbeiten. Wenn ein Computer heruntergefahren wird, sendet die letzte Phase des Herunterfahrvorgangs jedem verbleibenden Prozess ein SIGTERM, gibt diesen Prozessen einige Sekunden Zeit und sendet ihnen dann ein SIGKILL.
Die Möglichkeit, dies für etwas anderes zu handhaben, als kill -9
einen Shutdown- Hook zu registrieren . Wenn Sie ( SIGTERM ) verwenden kill -15
können, funktioniert der Shutdown-Hook. ( SIGINT ) kill -2
bewirkt, dass das Programm die Shutdown-Hooks ordnungsgemäß beendet und ausführt .
Registriert einen neuen Hook zum Herunterfahren der virtuellen Maschine.
Die Java Virtual Machine wird als Reaktion auf zwei Arten von Ereignissen heruntergefahren:
- Das Programm wird normal beendet, wenn der letzte Nicht-Daemon-Thread beendet wird oder wenn die Methode exit (entsprechend System.exit) aufgerufen wird, oder
- Die virtuelle Maschine wird als Reaktion auf einen Benutzerinterrupt wie die Eingabe von ^ C oder ein systemweites Ereignis wie die Benutzerabmeldung oder das Herunterfahren des Systems beendet.
Ich habe das folgende Testprogramm unter OSX 10.6.3 ausprobiert und kill -9
darauf den Shutdown-Hook NICHT wie erwartet ausgeführt. Auf einem kill -15
es DOES das Herunterfahren Haken jedes Mal ausgeführt werden .
public class TestShutdownHook
{
public static void main(String[] args) throws InterruptedException
{
Runtime.getRuntime().addShutdownHook(new Thread()
{
@Override
public void run()
{
System.out.println("Shutdown hook ran!");
}
});
while (true)
{
Thread.sleep(1000);
}
}
}
Es gibt keine Möglichkeit, kill -9
in einem Programm wirklich elegant mit einem umzugehen.
In seltenen Fällen kann die virtuelle Maschine abgebrochen werden, dh die Ausführung wird beendet, ohne dass das System ordnungsgemäß heruntergefahren wird. Dies tritt auf, wenn die virtuelle Maschine extern beendet wird, z. B. mit dem SIGKILL-Signal unter Unix oder dem TerminateProcess-Aufruf unter Microsoft Windows.
Die einzige echte Option, um mit a kill -9
umzugehen, besteht darin, ein anderes Watcher-Programm zu überwachen, damit Ihr Hauptprogramm verschwindet oder ein Wrapper-Skript verwendet. Sie können dies mit einem Shell-Skript tun, das den ps
Befehl abfragt, der in der Liste nach Ihrem Programm sucht, und entsprechend handelt, wenn es verschwindet.
#!/usr/bin/env bash
java TestShutdownHook
wait
# notify your other app that you quit
echo "TestShutdownHook quit"
kill -9
bedeutet für mich: "Beginne, fauler Prozess, weg mit dir!", worauf der Prozess aufhören wird zu sein. Sofort.