2009-08-04 1 views
7

다른 프로그램이 동시에 실행되지 않도록 잠금 파일을 만드는 Java 프로그램이 있습니다. 프로그램을 실행하면 파일이 생성되고 종료되면 성공했거나 예외를 통해 파일이 제거됩니다. 그러나 사용자가 Ctrl + C를 누르거나 터미널을 닫거나 다른 방법으로 실행을 중단하면 파일이 삭제되지 않습니다. 이 인터럽트 명령을 감지하고 파일이이 경우에도 삭제되는지 확인하는 방법이 있습니까?Java에서 Ctrl + C처럼 시스템 인터럽트를 처리하는 방법

+0

아이러니하게도, 나는이 질문에 대해 잊어 버렸고 나중에 6 년 (관련 실제 경험) 관련 질문을 잊어 버렸다. [대답] (https://stackoverflow.com/a/34188676/113632) @Amber는 대부분의 자바 애플리케이션이 셧다운 훅을 사용해야하지만 실제로'SIGINT'와 연결된 질문을 처리하기 위해'sun.misc.Signal'을 사용해야하는 다른 시그널을 처리하는 것이 옳다. – dimo414

답변

5
+0

JVM이 비정상적으로 종료되면 종료 훅이 실행됩니까? 나는 그것을 의심 할 것이다. –

+0

@ mmyers, 이는 비정상적인 정의에 따라 다릅니다. :) Ctrl-C는 일반적으로 그들을 트리거합니다. 일반적으로 터미널을 닫지 않아도됩니다. – jsight

+1

이러한 잠금 파일을 100 % 완벽하게 삭제할 수있는 방법은 없습니다. 타임 스탬프를 사용하면 도움이 될 수 있지만, 몇 초마다 디스크 쓰기 작업을해야하는 비용이 든다. 많은 프로그램이 시작될 때 lockfile을 검색하고 사용자에게 lockfile을 알려줍니다. – Amber

2

이 처리 할 수있는 유일한 좋은 방법은 로그 파일에 타임 스탬프를하는 것입니다 또한

이 아마 전에 중복 또는 하루에서이 이전 SO 질문의 거의 중복 또는 두 개의이다 , 로그 파일을 몇 초마다 새로운 타임 스탬프로 업데이트하십시오. File.deleteOnExit이 도움이 될 것입니다. 그러나 아무런 방법도 없습니다 (누군가가 전원 코드를 당길 때 어떻게됩니까?).

타임 스탬프를 쓰는 경우 유효한 타임 스탬프 (최근에 기록됨)를 확인하고 너무 오래되었을 경우 로그 파일을 덮어 쓸 수 있습니다. 그렇게하면 부실 잠금 파일이 사용자의 방해가되지 않습니다.