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=true
non è 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+C
dovrebbe 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 INT
segnale 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. nohup
NON ignora il segnale INT. Quindi NON impedisce Ctrl+C
di funzionare.
Presumo che il tuo problema sia causato dalla e commerciale (&), non da nohup. Ctrl+C
invia 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 -9
o 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+C
funzionerà. Dai un'occhiata al controllo di Bash Job, più precisamente su fg
.