4

奇妙な問題

シグナルの受信時にJavaアプリを適切にシャットダウンしようとしています。または、kill経由で手動で送信します。SIGTERM、SIGHUP、SIGINT などを強制終了しようとしましたが、JVM がランタイム シャットダウン フックを呼び出さずに停止するたびに、最終的に Java コードで作成されたトラップをブロックまたはシグナルします。

    Runtime.getRuntime().addShutdownHook(new Thread("Shutdown hook") {
        @Override
        public void run() {
            vd.pretendRemoveAll();
        }
    });

shutdownHook が機能しなかった場合のハンドラを追加

    SignalHandler h = new SignalHandler() {
        @Override
        public synchronized void handle(Signal sig) {
            _logger.warn("Received signal: {}", sig);
            vd.pretendRemoveAll();
            System.exit(0);
        }
    };
    Signal.handle(new Signal("INT"), h);
    Signal.handle(new Signal("KILL"), h);
    Signal.handle(new Signal("HUP"), h);
    Signal.handle(new Signal("TERM"), h);

Java Javaバージョン「1.6.0_24」を使用してUbuntu 12.04で実行しています

OpenJDK ランタイム環境 (IcedTea6 1.11.5) (6b24-1.11.5-0ubuntu1~12.04.1)

OpenJDK 64 ビット サーバー VM (ビルド 20.0-b12、混合モード)

Oracle Java jdk1.6.0_37でも試してみましたが、同じ効果

プロセスで strace を使用して何が起こるかを確認すると、次のようになります。

user@server:~/appdir$ sudo strace -v -p 32277Process 32277 が接続されました - quitfutex(0x7f667f07d9d0, FUTEX_WAIT, 32278, NULL) = ? への割り込み ERESTARTSYS (再起動予定) --- SIGTERM (終了) @ 0 (0) --- futex(0x7f667e2543e0, FUTEX_WAKE_PRIVATE, 1) = 1 rt_sigreturn(0x7f667e2543e0) = 202 futex(0x7f667f07d9d0, FUTEX_WAIT, pid 32278: 7NULL PANIC2 付属 7NULL 143で終了

そして、このヌルパニックは怪しいように見えますが、次はどうなるかわかりません。

そのコードを Mac でテストしたところ、問題なく動作しました。問題の原因とそれを修正する方法はありますか? 設定が必要なセキュリティ機能/ポリシーはありますか?

4

1 に答える 1

-1

http://hellotojavaworld.blogspot.fr/2010/11/runtimeaddshutdownhook.htmlから着想を得たこのコード は、Ubuntu、jdk 1.6.30 でうまく動作します。静的メイン メソッドではなく、クラス インスタンスにいる必要があります。

public class AddShutdownHookSample {
 public void attachShutDownHook(){
  Runtime.getRuntime().addShutdownHook(new Thread() {
   @Override
   public void run() {
    System.out.println("Inside Add Shutdown Hook");
   }
  });
  System.out.println("Shut Down Hook Attached.");
 }
public static void main(String[] args) throws InterruptedException {

  AddShutdownHookSample sample = new AddShutdownHookSample();
  sample.attachShutDownHook();
        Thread.sleep(1000*60*1);
            //Print a message
  System.out.println("Last instruction of Program....");
  System.exit(0);
 }}
于 2014-08-25T16:22:22.450 に答える