プロセスがSIGTERMを受け取り、サブプロセス(たとえば/ bin / shコマンドを実行するJVM)を生成するときに何が起こるかを知りたいです。
どのような自動化がありますか、または親プロセスが終了し、子プロセスもSIGTERM信号を受信しますか?終了しますか?
答え1
LinuxプロセスがSIGTERMを受信したときに何が起こるのか(そして子プロセスに何が起こるのか)は、プログラマーの希望に完全に依存します。
プロセスは単に無視し(通常どおりビジネスを継続し)、突然終了して子プロセスを孤立したままにしたり、最終的に子プロセスを超えて信号を伝播できるプロセス内ビルドコード(関連ソフトウェア割り込みハンドラ)を実行するようにします。指示できます。注意深い。
Java Virtual Machineには、次の目的で使用できない固有の特性があります。はい… ;-)
信号用語?ただ無視してください(わかりました!ありがとうXRS追加オプション、他のコードがこれをより適切に処理します。
JVMに含まれるアプリケーションは、JVMシグナルハンドラと干渉する可能性があるSIGINTやSIGTERMなどの信号をキャプチャする必要があることがよくあります。 -Xrsオプションを使用してこの問題を解決できます。 -Xrs を使用すると、JVM は SIGINT、SIGTERM、SIGHUP、SIGQUIT のシグナルマスクを変更せず、これらのシグナルのシグナルハンドラはインストールされません。
どんな子供に何が起こりますか?まあ…すべては埋め込みアプリケーションによって異なります。
信号用語?ただ…優雅に閉じてください!
すべてのJavaプログラムに接続可能クローズフックマシンに。つまり、競合が発生する前にJVMが実行する必要があるコードです。次のように簡単です。
public class ShutDownHook
{
public static void main(String[] args)
{
Runtime.getRuntime().addShutdownHook(new Thread()
{
public void run()
{
System.out.println("Shutdown Hook is running !");
}
});
System.out.println("Application Terminating ...");
}
}
これにより、開発者は子プロセスを勝手にシャットダウンしたり、システムのダウンタイムによって一部のサブプロセスが突然シャットダウンしたりすることができます。
JVM(および一般的なVM)は、特定の信号(特にSIGTERM)の処理を仮想マシンの内部シグナルハンドラの外部でコーディング(およびカスタマイズ)できるという点で、標準のLinuxプロセスとは大きく異なります。これにより、仮想マシンが終了してもコードを実行できます。