2010-11-10 132 views
8

我使用下面的代碼捕獲Java中的INT信號在Java應用程序中的信號如何捕獲初始化:使用bash腳本

Signal.handle(new Signal("INT"), new SignalHandler() { 
     public void handle(Signal sig) { 

      log.warn("Received SIGINT signal. Will teardown."); 

      task.tearDown(); 

      // Force exit anyway 
      System.exit(1); 
     } 
     }); 

當我使用java -jar file.jar開始我的應用程序,我能趕上與kill -INT PID一起發送的信號。

如果我打電話java -jar file.jar &(jvm在後臺運行),我無法捕捉到與kill -INT發送的信號。

任何想法?

謝謝。

+0

當你使用kill -INT時,java進程會做什麼?它會終止還是繼續運行? – 2010-11-15 18:19:11

回答

3

適合我。你確定你正在殺死正確的pid嗎?在Unix上,您可以使用$!來獲取您啓動的最後一個進程的pid。

$ java -jar file.jar & 
[1] 25573 

$ kill -INT $! 
Received SIGINT signal. Will teardown. 

更新:

如果通過shell腳本啓動此背景時,操作系統會創建一個將被免疫鍵盤產生的信號,如SIGINT一個新的進程組。只有進程組ID與當前終端的進程組ID相匹配的進程才能接收這些信號。

因此,嘗試這樣當前終端的進程組中運行它:

. ./script.sh 

然後,您將能夠發送SIGINT。

關於職位控制的更多信息here

+0

這對我很有用。不起作用的是捕捉從bash腳本文件內部啓動的應用程序中的信號。 – simao 2010-11-10 17:54:33

+0

@simao - 你的bash腳本文件如何啓動java程序將很重要。你的java程序是一個守護進程嗎?這兩個過程如何相關(bash腳本和java程序)? – justkt 2010-11-10 17:57:33

+0

java程序不是守護進程,並使用2個線程運行。 java應用程序使用java -jar file.jar&.sh文件執行。謝謝。 – simao 2010-11-10 18:06:51

0

我打算猜測bash腳本忽略了SIGINT,並且子繼承了信號掩碼。

請在bash腳本中查找這樣的內容。 (可能有更多的數字不只是2.)

trap "" 2 

空字符串導致shell設置SIG_IGN。如果改爲使用:

trap ":" 2 

註冊一個不執行任何操作的處理程序。當子進程啓動時,任何安裝了處理程序的信號都會重置爲SIG_DFL。

+0

我試過了,但沒有解決我的問題 – simao 2010-11-15 15:29:50