2012-04-03 88 views
1

我正在創建TFTP服務器,並使用無限循環保持它運行。當我嘗試發送kill信號時Java進程的退出鉤子

/bin/kill -s SIGINT <pid> 

我希望Java進程關閉TFTP服務器並退出。

class TFTP { 
public void startTFTP(String str, String str1){ 
    try { 
     //Start TFTP server 
      // Both of below are not working. 
      Runtime.getRuntime().addShutdownHook(new Thread(){ 
       @Override 
       public void run(){ 
        //Shutdown tftp server 
        System.out.println("Exiting"); 
        System.exit(0); 
       } 
      }); 

      SignalHandler handler = new SignalHandler() { 
       public void handle(Signal signal) { 
        System.exit(0); 
       } 
      }; 
      Signal.handle(new Signal("INT"), handler); 
      Signal.handle(new Signal("TERM"), handler); 

      while(true){ 
      // Infinite loop to keep process running. 
      } 
     } 
    } catch (Exception e) { 

    } 
} 
public static void main(String args[]){ 
     TFTP tftp = new TFTP(); 
     tftp.startTFTP(args[0],args[1]); 
} 

}

我從腳本殺死進程,並呼籲

/bin/kill -s SIGINT <pid> 

不殺出於某些原因,Java進程。我以爲SIGINT是作爲

的一部分處理的
Signal.handle(new Signal("INT"), handler); 

我在這裏錯過了什麼?

問候
Dheeraj喬希

+0

你見過http://stackoverflow.com/questions/2541475/capture-sigint-in-java? – 2012-04-03 15:22:57

+0

是的,我沒有谷歌搜索和搜索舊的StackOverFlow線程。但殺-2也不適合我。所以我想知道我想我做了一些基本的錯誤。 – 2012-04-03 15:28:54

回答

1

我認爲你需要發送'SIGTERM'('kill'w/o'-s'參數)以使關機掛鉤工作。

+0

kill -TERM 也不會調用shutdown hook – 2012-04-03 15:45:53

+0

kill -KILL 調用shutdown hook。殺人手冊頁幫助:) – 2012-04-03 15:54:01

1

我會在一個新的線程啓動TFTP服務器,以及(x)在主線程做了Thread.sleep。這樣,主線程可以被中斷。

1

我剛讀到:--- SIGTERM類似於要求進程很好地終止,允許清理和關閉文件。出於這個原因,在關閉期間的許多Unix系統上,init向所有對關機不重要的進程發出SIGTERM,等待幾秒鐘,然後發出SIGKILL來強制終止所有這些進程。

,這樣你們還可能需要使用SIGKILL在未來是不是要關閉電源基本過程.. ü可以檢查需要被殺死,先用SIGTERM嘗試進程ID,如果某些進程仍然後使用SIGKILL。或者如你所說,你可以先使用kill命令,並殺死那些你想強行殺死的命令。