これらは、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によって登録されたフック)、または単に無視することができます(不良)。
nohup
HUP信号を無視するためにトラップで以下のプログラムを実行するコマンドです。HUPは、電話を切ったときにプログラムを終了するために使用されます(たとえば、ssh接続を閉じます)。さらに、消失したTTYでプログラムがブロックするのを回避するために、出力をリダイレクトします。nohup
INT信号を無視しません。だからそれはCtrl+C
働くことを妨げません。
あなたの問題は、nohupではなくアンパサンド(&)が原因で発生したと思います。Ctrl+C
フォアグラウンドプロセスにシグナルを送信します。アンパサンドを使用すると、アプリケーションがバックグラウンドで実行されます。1つの解決策:行う
kill -INT pid
アプリケーション(ここではJVM)がトラップして正常に終了できないため、kill -9
またはを使用kill -KILL
します。
別の解決策は、アプリケーションをフォアグラウンドで戻すことです。その後、Ctrl+C
動作します。Bash Jobコントロール、より正確にはをご覧くださいfg
。