TCP connection 이 승계될 수 있나요?
글쓴이: winner / 작성시간: 수, 2014/01/15 - 6:04오후
Linux 에서 tomcat application 을 통해 process 를 2개 이상 실행시켰습니다.
그리고 tomcat 을 중지하자 tomcat 이 사용 중이었던 8882 port ESTABLISHED 가
실행시켜두었던 한 process 로 넘어갔습니다. 그리고 이 process 를 중짘시키자 8882 port 는
tomcat 이 실행했던 다른 process 에게 넘어갔습니다.
이 문제가 특히 중요한 것은 중지되었던 tomcat 을 재실행 시키지 못한다는 것입니다.
결국 tomcat 이 실행시켰던 모든 process 를 중지하자 8882 port 는 닫혔고, 비로소
tomcat 을 실행시킬 수 있었습니다.
이런 현상이 왜 벌어질까요? Tomcat 이 실행시키지 않고, 각자 process 를 bash 에서 실행시키면
이런 문제는 발생하지 않습니다
Tomcat application 개발자는 8882 port 는 tomcat 이 내부적으로 사용하는 port 라서
Web application 에 접속하기 위한 port 도 아니라고 하네요.
아시는 분 답변 부탁드립니다.
Forums:
대충 추측해보자면...
어떤 언어를 사용하더라도 리눅스상에서 프로세스를 생성하면 fork 시스템콜을 이용할텐데요.
fork의 특징중 하나가 부모 프로세스의 파일 디스크립터 테이블을 자식 프로세스에게 복사한
다는 특징이 있습니다. 그래서 프로세스 2개를 생성할 때 8882 포트를 사용하는 소켓도 당연
히 복사가 되었을 것이고 8882 포트에 해당하는 소켓에 대한 참조가 3이 되겠죠.
여기서 톰캣을 중지한다고해도 나머지 2개의 프로세스가 이 소켓을 사용중이기 때문에 OS에서는
소켓을 close 하지 않을것이고 톰캣을 재실행 하면 bind쪽에서 Address already in use 에
러가 발생하기 때문에 재시작이 되지 않은거라고 보여집니다.
음... Java 는 무조건 FD_CLOEXEC 을 쓴다는 글이 있네요.
http://stackoverflow.com/questions/8997643/launch-a-child-process-from-java-that-doesnt-inherit-files-ports-on-unix
일단 댓글 달아주신 것 이외에는 다른 가능한 해석이 현재로서는 없네요.
Tomcat 에서 내부적으로 쓴다면 Java 로 socket 을 열지 않았을 수도 있을테고...
확인해보니 server.xml 에서 Server port="8882" shutdown="SHUTDOWN" 에 들어가는 port 네요... 음... 이게 뭐 특별한 것인지...
일단 fd 들이 복사된 것은 확인했습니다. Log file 인 catalina.out 도 복사되었네요.
흠.. sub process 를 실행시킬 때 JNI 로 system("... &") 를 했다네요.
system 도 exec 을 할 것 같은데... 뭐가 뭔지...
댓글 달기