2012-05-02 3 views
3

서비스로 실행되는 응용 프로그램을 개발 중입니다. 일부 파일 정리를 위해 프로그램에 종료 훅을 추가했습니다. 서비스를 (데몬이나 Windows 서비스로서 Linux에서) 프로그램으로 설치하면 shutdown hook이 올바르게 실행됩니다. 그러나 IDE에서 실행 중이면 종료 훅이 절대로 실행되지 않습니다. IDE에서 실행중인 프로세스를 중지하고 종료 후크를 실행하는 방법이 있습니까?NetBeans IDE에서 종료 훅 실행

감사합니다, 파블로

답변

2

불행하게도 현재 넷빈즈 시스템 내에서이 작업을 수행 할 수있는 방법은 응용 프로그램 테스트의 두 가지 유형 (디버그 및 일반) 모두에 킬 (kill) 방식 때문에, 잘주는 프로세스를 종료, 없다 청소할 기회가 없다. 앱의 아키텍처에 따라 System.exit (0) 호출을 추가 할 수는 있지만 콘솔에서 열어야하는 것과는 다른 것입니다.

0

아니요. 종료 후크를 사용하여 프로그램을 정리하지 마십시오. 가상 머신 즉, 정상적으로 종료하지 않고 실행 정지, 중단 할 수 있습니다 드문 경우에서 docs ...

에서. 가상 컴퓨터가 외부에서 종료 된 경우 (예 : Unix의 경우 SIGKILL 신호 또는 Microsoft Windows의 경우 TerminateProcess 호출). 예를 들어 이 내부 데이터 구조를 손상 시키거나 존재하지 않는 메모리 인 에 액세스하려고 시도하여 원시 메소드가 실패 할 경우 가상 시스템 도 중단 될 수 있습니다. 가상 시스템이 중단되면 시스템 종료 훅이 실행되는지 여부에 대한 보장이 이루어지지 않습니다 ( ).

셧다운 훅이 항상 호출된다는 보장이 없다고 말하면 중요한 작업에 사용하지 않는 것이 좋습니다.

+1

예, 사용하기로 결정하기 전에 읽었습니다. 불행히도 서비스 랩퍼에서 Java 애플리케이션을 실행할 때 정리 작업을 수행 할 수있는 유일한 방법입니다. 서비스가 중지되거나 종료되면 종료 훅이 실행됩니다. 시작시 성공적인 종료를 확인하여 앱을 보호했습니다. 실패한 종료가 결정되면 서비스가 시작되지 않고 오류 로그가 생성되어 해결 될 수 있습니다. –

2

나는 동의하지 않습니다. 유닉스에서의 sigkill이나 윈도우에서의 프로세스 종료는 입니다.은 응용 프로그램이 이러한 이벤트를 포착 할 수있는 능력을주지 않고 실행 중입니다. 이것은 응답하지 않는 프로세스를 종료하는 데 필요합니다. 이 신호는 프로세스가 siginit (ctrl c) 또는 sigterm 또는 Windows의 끝 작업에 응답하지 않는 경우에만 사용해야합니다. NetBeans는 siginit 또는 sigterm보다는 sigkill을 보내는 것으로 보입니다. 내가 아는 한 이것은 나쁜 습관이다.

프로세스를 종료하려면 2 차 옵션이 있어야하지만 1 차 프로세스 버튼은 siginit 또는 sigterm을 보내야합니다. 응용 프로그램은 사용자가 ctrl c을 누르거나 응용 프로그램에서 작업을 끝내고 최선의 노력으로 files/sockets을 닫고 persistent/state 데이터를 저장해야합니다. 응용 프로그램은 sigkill 또는 종료 프로세스를 예상해서는 안되며 sigkill 또는 종료 프로세스가 필요없는 방식으로 개발되어야합니다.

NetBeans가 IDE에서 응용 프로그램을 종료하는 유일한 방법으로 이러한 방법을 사용하면 오류가 발생합니다.

관련 문제