これらは、Springアプリケーションをシャットダウンする多くの方法です。1つは、次のようにclose()を呼び出すことApplicationContextです。
ApplicationContext ctx =
SpringApplication.run(HelloWorldApplication.class, args);
// ...
ctx.close()
あなたの質問は、を実行してアプリケーションを閉じることを提案していますCtrl+C。これは、コマンドの終了によく使用されます。この場合...
使用endpoints.shutdown.enabled=trueは最高のレシピではありません。これは、エンドポイントを公開してアプリケーションを終了することを意味します。したがって、ユースケースと環境に応じて、それを保護する必要があります...
Ctrl+Cあなたの場合には非常にうまくいくはずです。アンパサンド(&)が原因で問題が発生したと思います。
Spring Application ContextがシャットダウンフックをJVMランタイムに登録している可能性があります。ApplicationContextのドキュメントを参照してください。
あなたが言ったように、Spring Bootがこのフックを自動的に構成するかどうかはわかりません。そうだと思います。
でCtrl+C、あなたのシェルが送信INTフォアグラウンドアプリケーションに信号を。「実行を中断してください」という意味です。アプリケーションはこの信号をトラップして、終了前にクリーンアップを行うか(Springによって登録されたフック)、または単に無視することができます(不良)。
nohupHUP信号を無視するためにトラップで以下のプログラムを実行するコマンドです。HUPは、電話を切ったときにプログラムを終了するために使用されます(たとえば、ssh接続を閉じます)。さらに、消失したTTYでプログラムがブロックするのを回避するために、出力をリダイレクトします。nohupINT信号を無視しません。だからそれはCtrl+C働くことを妨げません。
あなたの問題は、nohupではなくアンパサンド(&)が原因で発生したと思います。Ctrl+Cフォアグラウンドプロセスにシグナルを送信します。アンパサンドを使用すると、アプリケーションがバックグラウンドで実行されます。1つの解決策:行う
kill -INT pid
アプリケーション(ここではJVM)がトラップして正常に終了できないため、kill -9またはを使用kill -KILLします。
別の解決策は、アプリケーションをフォアグラウンドで戻すことです。その後、Ctrl+C動作します。Bash Jobコントロール、より正確にはをご覧くださいfg。