Vom Wikipedia entry:
In Unix- und Unix-ähnlichen Betriebssystemen, töten ist ein Befehl verwendet, um ein Signal an einen Prozess senden. Die gesendete Nachricht ist standardmäßig das Beendigungssignal, das den Prozess zum Beenden auffordert. Aber töten ist etwas von einer falschen Bezeichnung; Das gesendete Signal hat möglicherweise nichts mit Prozessabtötung zu tun.
So standardmäßig Kill sendet SIGTERM (entspricht -15 zu töten) Sie wahrscheinlich SIGKILL tun müssen, um:
kill -9 $PID
oder wenn Sie besonders vorsichtig gewesen, oder Sie müssen das System zum Herunterfahren anmutig dann empfehle ich Ihnen, SIGINT zu verwenden, da es dasselbe wie Ctrl-C auf der Tastatur ist. So
kill -2 $PID
Java-Anwendungen Ich habe Angst doesn't always handle SIGTERM correctly sie stützen sich auf ein gutes Verhalten in den Shutdown-Haken. Um sicherzustellen, dass eine App richtig Signale behandelt wie SIGTERM Sie direkt das SIGTERM Signal verarbeiten kann:
public class CatchTerm {
public static void main(String[] args) throws Exception {
Signal.handle(new Signal("TERM"), new SignalHandler() {
public void handle(Signal sig) {
//handle sigterm such as System.exit(1)
}
});
Thread.sleep(86400000);
}
}
Der Vollständigkeit halber sind hier die common signals
| Signal | ID | Action | Description | Java
| --- | --- | --- | --- | ---
| SIGHUP | 1 | Terminate | Hangup | The application should reload any config
| SIGINT | 2 | Terminate | Ctrl-C | Keyboard interrupt, start clean shutdown
| SIGQUIT | 3 | Terminate | Terminal quit signal | JVM traps and issues a Thread dump
| SIGABRT | 6 | Terminate | Process abort signal | Do not handle, quit immediately
| SIGKILL | 9 | Terminate | Kill (forced) | Cannot be trapped
| SIGTERM | 15 | Terminate | Termination signal. | Quit quickly, safe but fast
Für anspruchsvollere Prozessauswahl sehen killall und pkill:
Das 'if' ist besser geschrieben als' if [["x"! = "X $ PID"]] ', dies stellt sicher, dass'! = 'Für den Stringvergleich verwendet wird (als Bonus sorgt es auch dafür, dass' grep 'Abfragen werden in verschiedenen Shells korrekt behandelt. – grochmal
Der Code sieht im Grunde korrekt aus - Sie könnten das, was Sie mit "shomehow nicht funktioniert" meinen, aber wir gehen davon aus, dass der Prozess den Kill überlebt. Wenn dir die Antwort von Neil Ellis nicht hilft, müsstest du mehr erklären. - Was ich mache, wenn ich fixe Strings aus der PS-Ausgabe lösche, ist wie 'ps -eaf | grep '[J] VM'' .. das benötigt 'grep -v grep' nicht, da der grep-Befehl nicht mit dem regex übereinstimmt –