2012-04-03 4 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 Joshi

+0

Вы видели http://stackoverflow.com/questions/2541475/capture-sigint-in-java? –

+0

Да, я сделал поиск в Google и поискал старые потоки StackOverFlow. Но kill -2 тоже не работает для меня. Так что мне было интересно, я думаю, я сделал некоторые основные ошибки. –

ответ

1

Я думаю, вам нужно послать 'SIGTERM' (параметр 'kill' w/o '-s') для запуска выключения.

+0

kill -TERM также не вызовет крюк выключения –

+0

kill -KILL вызывает выключение крюка. Страница man на kill помогает :) –

1

Я бы запустить сервер TFTP в новом потоке, и сделать Thread.sleep (х) в основном потоке. Таким образом, основной поток может быть прерван.

1

Я только что прочитал: --- SIGTERM сродни тому, чтобы просить процесс прекратить красиво, позволяя очищать и закрывать файлы. По этой причине во многих системах Unix во время выключения init вызывает SIGTERM для всех процессов, которые не являются существенными для выключения, ждет несколько секунд, а затем выдает SIGKILL принудительное прекращение любых оставшихся процессов.

так что вам, возможно, понадобится использовать SIGKILL и в будущем для процессов, которые не являются существенными для выключения питания. u можете проверить идентификаторы процесса, которые необходимо убить, и попробовать сначала SIGTERM, и если некоторые процессы останутся затем используйте SIGKILL. или, как вы сказали, вы можете сначала использовать команду kill и убить -9 для тех, которые вы хотите убить насильственно.

Смежные вопросы