どの言語のどのプログラムでも、SIGKILL を処理することはできません。これは、プログラムにバグや悪意がある場合でも、常にプログラムを終了できるようにするためです。しかし、プログラムを終了させる手段は SIGKILL だけではありません。もう 1 つは、SIGTERM を使用することです。プログラムはそのシグナルを処理できます。プログラムは、制御された、しかし迅速なシャットダウンを行うことによってシグナルを処理する必要があります。コンピュータがシャットダウンすると、シャットダウン プロセスの最終段階で残りのすべてのプロセスに SIGTERM が送信され、それらのプロセスに数秒の猶予が与えられ、その後 SIGKILL が送信されます。
これ以外の場合にこれを処理する方法は、シャットダウンフックkill -9
を登録することです。( SIGTERM )を使用できる場合、シャットダウン フックが機能します。( SIGINT )プログラムを正常に終了させ、シャットダウン フックを実行させます。kill -15
kill -2
新しい仮想マシンのシャットダウン フックを登録します。
Java 仮想マシンは、次の 2 種類のイベントに応答してシャットダウンします。
- 最後の非デーモン スレッドが終了するか、exit (同等の System.exit) メソッドが呼び出されると、プログラムは正常に終了します。
- 仮想マシンは、^C の入力などのユーザー割り込み、またはユーザー ログオフやシステム シャットダウンなどのシステム全体のイベントに応答して終了します。
OSX 10.6.3 で次のテスト プログラムを試しましたが、期待どおりにシャットダウン フックが実行されませんkill -9
でした。毎回シャットダウンフックを実行します。kill -15
public class TestShutdownHook
{
public static void main(String[] args) throws InterruptedException
{
Runtime.getRuntime().addShutdownHook(new Thread()
{
@Override
public void run()
{
System.out.println("Shutdown hook ran!");
}
});
while (true)
{
Thread.sleep(1000);
}
}
}
kill -9
どのプログラムでもa を本当に適切に処理する方法はありません。
まれに、仮想マシンが異常終了する場合があります。つまり、正常にシャットダウンせずに実行を停止する場合があります。これは、仮想マシンが外部で終了した場合に発生します。たとえば、Unix の SIGKILL シグナルや Microsoft Windows の TerminateProcess 呼び出しによって発生します。
a を処理する唯一の実際のオプションkill -9
は、別のウォッチャー プログラムでメイン プログラムが終了するのを監視するか、ラッパー スクリプトを使用することです。ps
リスト内のプログラムを探してコマンドをポーリングし、それが消えたときにそれに応じて行動するシェルスクリプトを使用してこれを行うことができます。
#!/usr/bin/env bash
java TestShutdownHook
wait
# notify your other app that you quit
echo "TestShutdownHook quit"