2014-03-26 3 views
1

소켓 서버 응용 프로그램이 있습니다. 이 응용 프로그램 종료 서버와 표준 Java 종료 훅의 내부 포트에서 바인딩 해제 프로세스가 중지됩니다 :자바 프로세스의 종료 후크가 gradle 데몬에서 실행되지 않습니다.

Runtime.getRuntime().addShutdownHook(new ShutdownHook()); 

내가 명령 줄에서 실행하는 응용 프로그램의 Gradle을 플러그인을 사용 : 내가 실행할 때

apply plugin: 'application' 
mainClassName = "com.ServerLauncher" 

을하지만, gradle에서 응용 프로그램 :

./gradlew :server:run 

그리고 나서 내 종료 후크가 트리거되지 않는 응용 프로그램을 닫습니다.

나는 gradle이 자바 프로세스를 시작하는 자체 프로세스를 시작하기 때문에 그런 것 같지만 Java 프로세스가 종료 신호를받지 못하는 것 같습니다.

+0

--stop 명령을 사용하여 중지하려고합니까? – fmodos

+0

아니, 어떻게해야합니까? – endryha

답변

1

나는 해결책을 발견했습니다, 나는 Gradle을 실행하지 말할 필요가이 문제를 방지하는 데이 명령 행 인수를 전달 데몬 스레드의

./gradlew :server:run --no-daemon 
0

당신이 그것으로 데몬을 계속 사용하는 것이 더 좋을 것이다 다양한 이점을 제공합니다.

그런 다음 실행을 시작한 Gradle 프로세스를 중지하는 대신 TERM 신호를 전송하여 응용 프로그램을 실제로 중지 할 수있는 가능한 솔루션이 있습니다. killjps (또는 간단히 ps)의 설명서를 살펴보십시오.

1

현재의 Gradle 버전은 기본적으로 Gradle 데몬을 사용합니다. 실제로 일어나는 일은 Ctrl + C (Ctrl + Z 대신에 그것을 의미한다고 생각합니다)를 누르면 응용 프로그램을 종료하는 것이 아니라 전체 Gradle 프로세스를 종료하는 것입니다. 약 10 초 정도 걸립니다. 셧다운 훅은 실행되지만 지연이 있고 Gradle이 콘솔 출력에서 ​​분리되면 아무 메시지도 표시되지 않습니다.

현재 가장 간단한 해결 방법은 --no-daemon 스위치를 추가하는 것입니다.

이 동작을 수정하기 위해 Gradle에 제안 된 개선 사항이 있습니다. 투표 할 수 있습니다 : https://github.com/gradle/gradle/issues/1128

관련 문제