CLI 애플리케이션에서 Ctrl + C를 어떻게 "간섭"할 수 있습니까?


85

CLI (명령 줄 인터페이스) Java 애플리케이션에서 + (일반적으로 프로세스를 종료 함)를 어떻게 가로 챌 수 있습니까?CtrlC

다중 플랫폼 솔루션이 존재합니까 (Linux, Solaris, Windows)?

나는 Console's를 사용 readLine()하고 있지만 필요한 경우 다른 방법을 사용하여 표준 입력에서 문자를 읽을 수 있습니다.

답변:


121
Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() { /*
       my shutdown code here
    */ }
 });

이것은 신호를 가로 챌 수 있어야하지만 JVM이 완전히 종료되기 전에 중간 단계로만 수행되므로 돌보는 것이 아닐 수도 있습니다.

+로 트리거되는 신호 를 가로 채려면 SignalHandler( sun.misc.SignalHandler) 를 사용해야합니다 ( Windows뿐 아니라 Unix에서도). 이 기사를 참조 하십시오 (pdf, 페이지 8 및 9).SIGINTCtrlC


5
@MartijnCourteaux 그것은 5 년 후에 일어난다;) 나는 그 주제에 대해 비슷한 소스를 발견했고 그에 따라 링크를 변경했습니다.
VonC 2014

@VonC는 - 그것은 다시 죽은입니다
거 윈더 싱

@GurV 어느 링크? 내가 2014 년 4 월에 편집 한 내용 ( stackoverflow.com/revisions/… )은 여전히 ​​유효합니다. 여전히 pdf 파일을 다운로드 할 수 있습니다 ..
VonC

16

정상적으로 종료하고 종료 프로세스를 단락시키지 않기를 원한다고 가정합니다. 내 가정이 맞다면 Shutdown Hooks를 살펴 봐야 합니다.


이전에는 셧다운 후크에 대해 들어 본 적이 없습니다. 감사합니다!
ivan_ivanovich_ivanoff

8

어떤 이유로 종료하지 않고 Ctrl+ 를 처리 할 수 ​​있으려면 C특정 형태의 신호 처리를 사용해야합니다 ( Ctrl+ C입력은 실제로 애플리케이션에 직접 전달되지 않고 대신 생성하는 OS에 의해 처리되기 때문에). 그런 다음 Java로 전달되는 SIGINT.

신호 처리에 대한 자세한 내용 은 http://www.oracle.com/technetwork/java/javase/signals-139944.html 을 참조 하십시오 .

(정상적으로 종료하려면 akf의 대답으로 충분합니다.)


4

SIGTERM을 처리하는 방법에 대한 링크-프로그램이 OS 측에서받는 신호입니다.

http://blog.webinf.info/2008/08/intercepting-sigterm.html

http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/signals.html

http://www.ibm.com/developerworks/java/library/i-signalhandling/

그것은 POSIX 운영 체제에서 작동해야합니다.


1
두 번째 링크가 실패합니다. oracle.com/technetwork/java/javase/tsg-vm-149989.pdf 에서 Oracle로 변경 되었습니까?
기회

세 번째 링크도 실패
Hugo Zaragoza
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.