2009-10-23 2 views
58

Ctrl + C 신호를 Java 명령 줄 프로그램에서 catch 할 수 있습니까? 프로그램을 종료하기 전에 일부 리소스를 정리하고 싶습니다.Java에서 Ctrl + C 잡기

답변

65

당신은 VM이 종료 될 때마다 실행 가져옵니다 VM에 shutdown hook을 첨부 할 수는 :

  • 프로그램 :

    Java 가상 머신 이벤트 두 종류의 응답에 종료 마지막으로 비 데몬 스레드가 종료되거나 exit (즉, System.exit) 메서드가 호출 될 때 정상적으로 종료되거나 또는

  • virt Ctrl + C과 같은 사용자 인터럽트 나 사용자 로그 오프 또는 시스템 종료와 같은 시스템 전체 이벤트에 대한 응답으로 종료됩니다.

종료 후크하지만 몇 가지 규칙을 따라야하므로, 어떠한 문제가 발생하지 않도록 신중하게 링크 된 문서를 읽을 수있다 당신이 전달하는 스레드. 스레드 안전성, 스레드의 신속한 종료 등이 포함됩니다.

또한 제 스퍼가 말한 것처럼 종료 훅은 VM의 정상 종료시 실행되도록 보장되지만 VM 프로세스가 강제 종료 될 경우 ' 티. 네이티브 코드가 망가 지거나 프로세스를 강제로 종료하는 경우에 발생할 수 있습니다 (kill -9, taskkill /f).

그러나 이러한 시나리오에서는 모든 베팅이 어쨌든 꺼져 있으므로 너무 많은 생각을 낭비하지 않을 것입니다. 그냥 빠른 콘솔 테스트 목적

+0

종료 훅이 모든 상황에서 실행이 보장되지 않은주의; 실행되지 않는 상황이있을 수 있으므로 종료 훅에서 수행하는 작업에 따라 프로그램이 올바르게 작동하지 않도록하십시오. – Jesper

+0

프로세스가 강제 종료 ('TerminateProcess()'또는'SIGKILL')되었을 때 실행되지 않습니다. 그러나 이것은 정상적인 동작을 벗어났습니다. 그리고 Ctrl + C가 이미 종료 훅에 의해 덮여 있으므로 안전하게 사용할 수 있습니다. OS가 실제로 프로세스를 종료하는 경우에는 많은 작업을 수행 할 수 없습니다. – Joey

+0

'kill '(TERM 신호를 보내는)을 실행하면, shutdown hook에서이 신호가 잡힐까요? (위의 내용에서 이해할 수있는'kill -9'와는 다르다는 것을 기억하십시오.) – ADTC

14

...

Runtime.getRuntime().addShutdownHook(new Thread() { 
     public void run() { 
      try { 
       Thread.sleep(200); 
       System.out.println("Shouting down ..."); 
       //some cleaning up code... 

      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    }); 
+2

당신의 예가 RaspberryPI에 특화되어 있습니다 ('SoftPwm','gpio'). 이러한 메소드 호출을 생략 할 수 있습니다. – harpun