Il existe de nombreuses façons d'arrêter une application à ressort. La première consiste à appeler close () sur le ApplicationContext
:
ApplicationContext ctx =
SpringApplication.run(HelloWorldApplication.class, args);
// ...
ctx.close()
Votre question suggère que vous souhaitez fermer votre application en faisant Ctrl+C
, qui est fréquemment utilisé pour terminer une commande. Dans ce cas...
L'utilisation endpoints.shutdown.enabled=true
n'est pas la meilleure recette. Cela signifie que vous exposez un point de terminaison pour mettre fin à votre application. Ainsi, en fonction de votre cas d'utilisation et de votre environnement, vous devrez le sécuriser ...
Ctrl+C
devrait très bien fonctionner dans votre cas. Je suppose que votre problème est causé par l'esperluette (&) Plus d'explication:
Un contexte d'application Spring peut avoir enregistré un hook d'arrêt avec le runtime JVM. Consultez la documentation ApplicationContext .
Je ne sais pas si Spring Boot configure ce hook automatiquement comme vous l'avez dit. Je suppose que oui.
Activé Ctrl+C
, votre shell envoie un INT
signal à l'application au premier plan. Cela signifie "veuillez interrompre votre exécution". L'application peut intercepter ce signal et effectuer un nettoyage avant sa fin (le hook enregistré par Spring), ou simplement l'ignorer (mauvais).
nohup
est une commande qui exécute le programme suivant avec un trap pour ignorer le signal HUP. HUP est utilisé pour terminer le programme lorsque vous raccrochez (fermez votre connexion ssh par exemple). De plus, il redirige les sorties pour éviter que votre programme ne se bloque sur un TTY disparu. nohup
n'ignore PAS le signal INT. Cela n'empêche donc PAS Ctrl+C
de travailler.
Je suppose que votre problème est causé par l'esperluette (&), pas par nohup. Ctrl+C
envoie un signal aux processus de premier plan. L'esperluette entraîne l'exécution de votre application en arrière-plan. Une solution: faire
kill -INT pid
Utilisez kill -9
ou kill -KILL
est incorrect car l'application (ici la JVM) ne peut pas l'intercepter pour se terminer correctement.
Une autre solution consiste à ramener votre application au premier plan. Puis Ctrl+C
fonctionnera. Jetez un œil sur le contrôle Bash Job, plus précisément sur fg
.