Es gibt viele Möglichkeiten, eine Federanwendung abzuschalten. Eine ist, close () aufzurufen ApplicationContext
:
ApplicationContext ctx =
SpringApplication.run(HelloWorldApplication.class, args);
// ...
ctx.close()
Ihre Frage schlägt vor, dass Sie Ihre Anwendung schließen möchten, indem Sie dies tun Ctrl+C
, was häufig zum Beenden eines Befehls verwendet wird. In diesem Fall...
Verwendung endpoints.shutdown.enabled=true
ist nicht das beste Rezept. Dies bedeutet, dass Sie einen Endpunkt zum Beenden Ihrer Anwendung verfügbar machen. Abhängig von Ihrem Anwendungsfall und Ihrer Umgebung müssen Sie ihn also sichern ...
Ctrl+C
sollte in Ihrem Fall sehr gut funktionieren. Ich gehe davon aus, dass Ihr Problem durch das kaufmännische Und (&) verursacht wird. Weitere Erläuterungen:
Ein Spring-Anwendungskontext hat möglicherweise einen Shutdown-Hook bei der JVM-Laufzeit registriert. Siehe ApplicationContext-Dokumentation .
Ich weiß nicht, ob Spring Boot diesen Hook automatisch konfiguriert, wie Sie sagten. Ich nehme an, es ist.
Ein Ctrl+C
, Ihre Shell sendet ein INT
Signal an die Vordergrundanwendung. Es bedeutet "Bitte unterbrechen Sie Ihre Ausführung". Die Anwendung kann dieses Signal abfangen und vor seiner Beendigung bereinigen (der von Spring registrierte Hook) oder es einfach ignorieren (schlecht).
nohup
ist ein Befehl, der das folgende Programm mit einem Trap ausführt, um das HUP-Signal zu ignorieren. HUP wird verwendet, um das Programm zu beenden, wenn Sie auflegen (schließen Sie beispielsweise Ihre SSH-Verbindung). Darüber hinaus werden die Ausgaben umgeleitet, um zu vermeiden, dass Ihr Programm auf einem verschwundenen TTY blockiert. nohup
ignoriert das INT-Signal NICHT. Es verhindert also NICHT, dass Ctrl+C
es funktioniert.
Ich gehe davon aus, dass Ihr Problem durch das kaufmännische Und (&) und nicht durch nohup verursacht wird. Ctrl+C
sendet ein Signal an die Vordergrundprozesse. Das kaufmännische Und bewirkt, dass Ihre Anwendung im Hintergrund ausgeführt wird. Eine Lösung: tun
kill -INT pid
Verwenden Sie kill -9
oder kill -KILL
ist schlecht, weil die Anwendung (hier die JVM) es nicht abfangen kann, um ordnungsgemäß zu beenden.
Eine andere Lösung besteht darin, Ihre Anwendung wieder in den Vordergrund zu stellen. Dann Ctrl+C
wird es funktionieren. Schauen Sie sich die Bash Job-Steuerung genauer an fg
.