Esistono molti modi per arrestare un'applicazione di primavera. Uno è chiamare close () su ApplicationContext:
ApplicationContext ctx =
SpringApplication.run(HelloWorldApplication.class, args);
// ...
ctx.close()
La tua domanda suggerisce di voler chiudere la tua applicazione facendo Ctrl+C, che è spesso usato per terminare un comando. In questo caso...
L'uso endpoints.shutdown.enabled=truenon è la ricetta migliore. Significa che esponi un endpoint per terminare l'applicazione. Quindi, a seconda del tuo caso d'uso e del tuo ambiente, dovrai proteggerlo ...
Ctrl+Cdovrebbe funzionare molto bene nel tuo caso. Presumo che il tuo problema sia causato dalla e commerciale (&) Altre spiegazioni:
Un contesto dell'applicazione Spring potrebbe aver registrato un hook di chiusura con il runtime JVM. Vedere la documentazione di ApplicationContext .
Non so se Spring Boot configuri questo hook automaticamente come hai detto. Suppongo che lo sia.
Su Ctrl+C, la tua shell invia un INTsegnale all'applicazione in primo piano. Significa "interrompi la tua esecuzione". L'applicazione può intercettare questo segnale ed eseguire la pulizia prima della sua terminazione (l'hook registrato da Spring), o semplicemente ignorarlo (cattivo).
nohupè il comando che esegue il seguente programma con una trap per ignorare il segnale HUP. HUP viene utilizzato per terminare il programma quando si riaggancia (ad esempio, chiudere la connessione SSH). Inoltre reindirizza gli output per evitare che il programma si blocchi su una TTY scomparsa. nohupNON ignora il segnale INT. Quindi NON impedisce Ctrl+Cdi funzionare.
Presumo che il tuo problema sia causato dalla e commerciale (&), non da nohup. Ctrl+Cinvia un segnale ai processi in primo piano. La e commerciale fa sì che l'applicazione venga eseguita in background. Una soluzione: fai
kill -INT pid
Utilizzare kill -9o kill -KILLè cattivo perché l'applicazione (qui la JVM) non può intercettarlo per terminare correttamente.
Un'altra soluzione è riportare la tua applicazione in primo piano. Allora Ctrl+Cfunzionerà. Dai un'occhiata al controllo di Bash Job, più precisamente su fg.