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=true
nie 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+C
powinien 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+C
twoja powłoka wysyła INT
sygnał 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).
nohup
to 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. nohup
NIE ignoruje sygnału INT. Więc to NIE przeszkadza Ctrl+C
w pracy.
Zakładam, że przyczyną problemu jest znak „&”, a nie „nohup”. Ctrl+C
wysyła sygnał do procesów pierwszoplanowych. Znak ampersand powoduje uruchomienie aplikacji w tle. Jedno rozwiązanie: zrób
kill -INT pid
Użyj kill -9
lub kill -KILL
jest 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+C
zadziała. Przyjrzyj się sterowaniu Bash Job, a dokładniej fg
.