2009-12-14 4 views
1

콘솔 java 응용 프로그램입니다. 누군가가 작업 관리자에 의해 java.exe 프로세스를 죽입니다. 응용 프로그램이 종료되기 전에이 시점에서 로그에 몇 가지 정보를 기록하려면 어떻게해야합니까?누군가가 java.exe 프로세스를 죽이는 순간 나는 어떻게 잡을 수 있습니까?

Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
    public void uncaughtException(Thread t, Throwable e) { ..... } 
}); 

또는

Runtime.getRuntime().addShutdownHook(new Thread() { 
    public void run() { ..... } 
}); 

는 이러한 상황

답변

6

이 불가능에서 실행되지 않습니다. 종료 후크 만 orderly shutdown에서 실행됩니다 가상 기계, 중단 할 수 있습니다 즉, 정상적으로 종료하지 않고 실행 을 중지한다

드문 경우. 가상 시스템 이 외부에서 종료 된 경우 (예 : , UNIX에서는 SIGKILL 신호) 또는 Microsoft Windows에서 TerminateProcess 호출이 발생합니다.

SIGINT과 같이 정상 종료를 유발하는 다른 신호를 보낼 수 있습니다. 신청서를 죽이면 신청서가 응답하지 않은 마지막 수단이어야합니다.

+0

고마워, 토마스! – Mikhail

2

몇 가지 해결책은 항상 로그 파일에 무언가를 쓰는 것입니다. 이 방법을 사용하면 Java 프로그램의 "마지막 숨"이 무엇이든 볼 수 있습니다.

+1

'++ logFileSize;' –

+0

@Dominic : 로그 파일 순환을 어떻게 설정하는지에 따라 다릅니다. –

+0

약간 번거롭지만 제안 사항 중에서 가장 신뢰할만한 해결책 인 것 같습니다. – Buhb

1

사용자에게 시스템을 정상적으로 종료하고 작업 관리자를 사용하지 말라고 알립니다.

2

CreateProcess (Windows)에서 작은 순진한 (예 : C++) 응용 프로그램을 통해 java.exe를 시작하려고 할 수 있습니다.이 응용 프로그램은 java 프로세스 핸들의 모니터링을 계속 실행합니다. 자바 프로세스가 사라지면 로그 할 수 있습니다.

3

몇 가지 실용적인 해결책이 이미 제안되었지만 다른 하나는 서로를 모니터하는 응용 프로그램 사이의 "최종 상태"메시지에 대한 탁구입니다. 사람이 죽으면 다른 사람은 마지막으로받은 메시지를 로그 파일에 씁니다. 사용자는 작업 관리자로 두 프로세스를 모두 신속하게 종료 할 수 없습니다.

+0

하지만 거의 동시에 프로그래밍 방식으로 모두를 죽일 수 있습니다. 즉, 어리석은 방법은 없지만 실제로는 거의 항상 작동합니다. – Chii

관련 문제