Istnieje wiele sposobów zamykania aplikacji sprężynowej. Jednym z nich jest wywołanie funkcji close () na ApplicationContext:
ApplicationContext ctx =
SpringApplication.run(HelloWorldApplication.class, args);
// ...
ctx.close()
Twoje pytanie sugeruje, że chcesz zamknąć aplikację, robiąc to Ctrl+C, co jest często używane do zakończenia polecenia. W tym przypadku...
Stosowanie endpoints.shutdown.enabled=truenie jest najlepszym przepisem. Oznacza to, że udostępniasz punkt końcowy, aby zamknąć aplikację. Tak więc, w zależności od przypadku użycia i środowiska, będziesz musiał je zabezpieczyć ...
Ctrl+Cpowinien działać bardzo dobrze w twoim przypadku. Zakładam, że przyczyną problemu jest znak & (&) Więcej wyjaśnień:
Kontekst aplikacji Spring mógł zarejestrować punkt zaczepienia zamknięcia systemu w środowisku wykonawczym maszyny JVM. Zobacz dokumentację ApplicationContext .
Nie wiem, czy Spring Boot skonfiguruje ten hak automatycznie, jak powiedziałeś. Zakładam, że tak.
W dniu Ctrl+Ctwoja powłoka wysyła INTsygnał do aplikacji pierwszego planu. To znaczy „proszę, przerwij wykonanie”. Aplikacja może przechwycić ten sygnał i wyczyścić go przed jego zakończeniem (zaczep zarejestrowany przez Spring) lub po prostu go zignorować (źle).
nohupto polecenie, które wykonuje następujący program z pułapką, aby zignorować sygnał HUP. HUP jest używany do kończenia programu po rozłączeniu się (na przykład zamknięcie połączenia ssh). Ponadto przekierowuje dane wyjściowe, aby uniknąć blokowania się programu na zaginionym TTY. nohupNIE ignoruje sygnału INT. Więc to NIE przeszkadza Ctrl+Cw pracy.
Zakładam, że przyczyną problemu jest znak „&”, a nie „nohup”. Ctrl+Cwysyła sygnał do procesów pierwszoplanowych. Znak ampersand powoduje uruchomienie aplikacji w tle. Jedno rozwiązanie: zrób
kill -INT pid
Użyj kill -9lub kill -KILLjest złe, ponieważ aplikacja (w tym przypadku JVM) nie może jej przechwycić, aby zakończyć w sposób wdzięczny.
Innym rozwiązaniem jest przywrócenie aplikacji na pierwszy plan. Wtedy Ctrl+Czadziała. Przyjrzyj się sterowaniu Bash Job, a dokładniej fg.