Có nhiều cách để tắt ứng dụng mùa xuân. Một là gọi close () trên ApplicationContext
:
ApplicationContext ctx =
SpringApplication.run(HelloWorldApplication.class, args);
// ...
ctx.close()
Câu hỏi của bạn gợi ý rằng bạn muốn đóng ứng dụng của mình bằng cách thực hiện Ctrl+C
, điều này thường được sử dụng để chấm dứt một lệnh. Trong trường hợp này...
Sử dụng endpoints.shutdown.enabled=true
không phải là công thức tốt nhất. Nó có nghĩa là bạn để lộ một điểm cuối để chấm dứt ứng dụng của mình. Vì vậy, tùy thuộc vào trường hợp sử dụng và môi trường của bạn, bạn sẽ phải bảo mật nó ...
Ctrl+C
sẽ hoạt động rất tốt trong trường hợp của bạn. Tôi cho rằng vấn đề của bạn là do dấu và (&) Giải thích thêm:
Bối cảnh ứng dụng mùa xuân có thể đã đăng ký một móc tắt với thời gian chạy JVM. Xem tài liệu ApplicationContext .
Tôi không biết liệu Spring Boot có tự động cấu hình hook này như bạn đã nói hay không. Tôi cho rằng đúng như vậy.
Khi bật Ctrl+C
, trình bao của bạn sẽ gửi một INT
tín hiệu đến ứng dụng nền trước. Nó có nghĩa là "hãy làm gián đoạn việc thực hiện của bạn". Ứng dụng có thể bẫy tín hiệu này và thực hiện dọn dẹp trước khi kết thúc (hook được Spring đăng ký) hoặc đơn giản là bỏ qua nó (xấu).
nohup
là lệnh thực hiện chương trình sau với một bẫy để bỏ qua tín hiệu HUP. HUP được sử dụng để kết thúc chương trình khi bạn treo máy (ví dụ: đóng kết nối ssh của bạn). Hơn nữa, nó chuyển hướng kết quả đầu ra để tránh chương trình của bạn chặn trên một TTY đã biến mất. nohup
KHÔNG bỏ qua tín hiệu INT. Vì vậy, nó KHÔNG ngăn cản Ctrl+C
hoạt động.
Tôi cho rằng sự cố của bạn là do dấu và (&), không phải do nohup. Ctrl+C
gửi một tín hiệu đến các quy trình nền trước. Dấu và khiến ứng dụng của bạn được chạy trong nền. Một giải pháp: làm
kill -INT pid
Sử dụng kill -9
hoặc kill -KILL
không tốt bởi vì ứng dụng (ở đây là JVM) không thể bẫy nó để kết thúc một cách duyên dáng.
Một giải pháp khác là đưa ứng dụng của bạn trở lại nền trước. Sau đó Ctrl+C
sẽ làm việc. Xem xét kiểm soát Bash Job, chính xác hơn fg
.