2017-11-18 10 views
2

のは、私たちは、このような些細なデーモンはJavaで書かれていると仮定してみましょう:JavaでSIGTERMシグナルをうまく処理するには?

public class Hellow { 
    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     while(true) { 
      // 1. do 
      // 2. some 
      // 3. important 
      // 4. job 
      // 5. sleep 
     } 

    } 
} 

と我々はそれが行われ、現在のステップが#であるのは、仮定しよう、デフォルトで--stop

SIGTERM(TERM)信号を送りstart-stop-daemonを使用してデーモン2。そして今、私たちはTERMシグナルを送ります。

何が起こるかは、実行がすぐに終了することです。

私はaddShutdownHook()を用いて信号イベントを処理できることを発見しましたが、事は、それはまだ現在の実行を中断し、ハンドラに制御を渡すことです:

public class Hellow { 
    private static boolean shutdownFlag = false; 
    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     // TODO code application logic here 
     registerShutdownHook(); 

     try { 
      doProcessing(); 
     } catch (InterruptedException ex) { 
      System.out.println(ex); 
     } 
    } 

    static private void doProcessing() throws InterruptedException { 
     int i = 0; 
     while(shutdownFlag == false) { 
      i++; 
      System.out.println("i:" + i); 
      if(i == 5) { 
       System.out.println("i is 5"); 
       System.exit(1); // for testing 
      } 

      System.out.println("Hello"); // It doesn't print after System.exit(1); 

      Thread.sleep(1000); 
     } 
    } 

    static public void setShutdownProcess() { 
     shutdownFlag = true; 
    } 

    private static void registerShutdownHook() { 
     Runtime.getRuntime().addShutdownHook(new Thread() { 
      public void run() { 
       System.out.println("Tralala"); 
       Hellow.setShutdownProcess(); 
      } 
     }); 
    } 
} 

だから、私の質問がある - それはあります現在の実行を中断することはできませんが、mainのループが正常に停止するようにshutdown_flag = Trueを設定できるように、分離されたスレッド(?)でTERMシグナルを処理できますか?

答えて

1

私はregisterShutdownHook()方法を書き換え、私が望んでいたとして、今では動作します。

private static void registerShutdownHook() { 
    final Thread mainThread = Thread.currentThread(); 
    Runtime.getRuntime().addShutdownHook(new Thread() { 
     public void run() { 
      try { 
       System.out.println("Tralala"); 
       Hellow.setShutdownProcess(); 
       mainThread.join(); 
      } catch (InterruptedException ex) { 
       System.out.println(ex); 
      } 

     } 
    }); 
} 
0

SignalHandlerを使用できます。この例を確認してください:https://dumpz.org/2707213/

INTERRUPTED信号に追いつき、operatingフラグを解除すると、正常にアプリがシャットダウンするようになります。

enter image description here

+0

はい、あなたの解決策は動作しますが、コンパイル時にコンパイラは将来の 'SignalHandler'が動作しないと誓っています。私は別の解決策を見つけましたが、ありがとう) –

関連する問題