2016-12-23 1 views
2

프로세스에서 여러 스레드를 만드는 프로그램을 작성하고 있습니다.프로세스가 외부에서 종료 된 경우 처리합니다.

프로세스가 kill -9 신호 또는 Ctrl + C를 사용하여 외부에서 종료되는 경우 내 프로그램이 예를 들어 닫기 전에 조치를 취해야합니다. 프로세스의 상태를 데이터베이스에서 중단되도록 변경해야합니다.

어떻게 처리 할 수 ​​있습니까?

addShutdownHook()이 필요합니까? 또는 내 문제에 대한 다른 더 나은 해결책이 있습니까? 내 주요 방법 내부

Runtime.getRuntime().addShutdownHook(new Thread() { 

      @Override 
      public void run() { 
       logger.info("Running Shutdown Hook"); 
       //call some method 
       System.out.println("Running Shutdown Hook"); 
      } 
     }); 

을, 그러나 작동하지 않습니다

는 내가 추가했습니다.

답변

1

짧은 대답 : 아마도 작동하지 않을 것입니다. 그 addShutdownHook()에 대한

참조의 JavaDoc : 드문 경우에

가상 시스템을 중단 할 수있다, 즉, 정상적으로 종료하지 않고 실행을 중지한다. 가상 시스템이 외부에서 종료 된 경우 (예 : Unix의 SIGKILL 신호 또는 Microsoft Windows의 TerminateProcess 호출) ... 가상 시스템이 중단되면 종료 훅이 실행되는지 여부는 보장 할 수 없습니다.

즉, 종료 훅은 요구 사항을 해결할 강력한 선택이 아닙니다.

+0

종료 훅은 Kill -15와 Ctrl-C조차도 사용할 수 있습니다. 무의식적으로 kill -9를 사용하지 말고 올바르게 사용하는 한 예상대로 작동해야합니다. – caburse

0

인스턴스화 할 장소에 넣었습니까? 다음을 실행하여 죽여보십시오.

import java.util.concurrent.TimeUnit; 

public class KillTest { 

    public static void main(String args[]) { 
     Runtime.getRuntime().addShutdownHook(new Thread() { 
      @Override 
      public void run() { 
       call some method 
       System.out.println("Running Shutdown Hook"); 
      } 
     }); 

     try{ 
      TimeUnit.MINUTES.sleep(10); 
     }catch(Exception e){ 
      System.out.println("Error thrown"); 
     }finally { 
      System.out.println("How awesome is finally?"); 
     } 
    } 
} 
+0

물론 백그라운드에서 실행중인 경우 로거를 추가해야합니다. – caburse

+1

답변을 얻지 못했습니다. 프로세스가 SHUTDOWN 신호를 받았을 때 ** sleep **의 요점은 무엇입니까? 게다가 ... 내 대답은 셧다운 훅이 "kill"신호에 대해 작동하지 않는다는 것을 잘 나타내고 있다고 생각한다. 따라서 원래 코드에 몇 가지 try/catch를 추가하는 것은 전혀 도움이되지 않습니다. – GhostCat

+0

@caburse 예 시도했지만 아무 것도 인쇄하지 않습니다. ( – chumak

관련 문제