Это много способов закрыть приложение Spring. Один из них - вызвать close () для ApplicationContext
:
ApplicationContext ctx =
SpringApplication.run(HelloWorldApplication.class, args);
// ...
ctx.close()
Ваш вопрос предполагает, что вы хотите закрыть свое приложение, выполнив Ctrl+C
, что часто используется для завершения команды. В таком случае...
Использовать endpoints.shutdown.enabled=true
не лучший рецепт. Это означает, что вы открываете конечную точку для завершения вашего приложения. Итак, в зависимости от вашего варианта использования и вашей среды вам нужно будет защитить его ...
Ctrl+C
должен очень хорошо работать в вашем случае. Я предполагаю, что ваша проблема вызвана амперсандом (&) Дополнительные объяснения:
Контекст приложения Spring может зарегистрировать перехватчик выключения во время выполнения JVM. См. Документацию ApplicationContext .
Я не знаю, настраивает ли Spring Boot этот хук автоматически, как вы сказали. Я так понимаю.
На Ctrl+C
, ваша оболочка посылает INT
сигнал к приложению переднего плана. Это означает «пожалуйста, прервите исполнение». Приложение может перехватить этот сигнал и выполнить очистку до его завершения (ловушка, зарегистрированная Spring) или просто проигнорировать его (плохо).
nohup
это команда, которая выполняет следующую программу с ловушкой для игнорирования сигнала HUP. HUP используется для завершения программы, когда вы кладете трубку (например, закрытие ssh-соединения). Более того, он перенаправляет выходные данные, чтобы ваша программа не блокировалась на исчезнувшем TTY. nohup
НЕ игнорирует сигнал INT. Так что Ctrl+C
работать НЕ мешает .
Я предполагаю, что ваша проблема вызвана амперсандом (&), а не nohup. Ctrl+C
посылает сигнал процессам переднего плана. Амперсанд заставляет ваше приложение работать в фоновом режиме. Одно решение: сделать
kill -INT pid
Использование kill -9
или kill -KILL
- это плохо, потому что приложение (здесь JVM) не может перехватить его для корректного завершения.
Другое решение - вернуть ваше приложение на передний план. Тогда Ctrl+C
будет работать. Взгляните на Bash Job control, точнее на fg
.