2017-05-12 3 views
0

배경 : Java 프로세스가 포트에 바인딩됩니다. 이제 Java 프로세스는 (jdk8s -XX : OnOutOfMemoryError를 사용하여) 서브 프로세스에서 쉘 스크립트를 시작합니다. 이 쉘 스크립트는 java 프로세스를 성공적으로 종료합니다. 불행히도 포트가 여전히 하위 프로세스에 바인딩되어 있기 때문에 Java 프로세스를 다시 시작할 수 없습니다 ...셸 : 열린 포트의 FD를 얻는 방법

저는 소켓에 연결된 모든 FD를 닫을 수 있다는 것을 알고 있습니다. 그래서 현재의 해결책은

INODE=$(netstat -tulpen | grep ":$PORT " | awk '{print $8}') 
FD_SOCKET=$(ls -l /proc/$$/fd | grep socket | grep "\[$INODE\]" | grep -o " [0-9]\+ -> " | awk '{print $1}') 
eval "exec $FD_SOCKET>&-" 

입니다. 실제로이 파이프 괴물을 피할 수 있습니까?

답변

1

소켓을 강제 종료하는 대신 OS를 상속받은 모든 프로세스가 종료되도록하여 OS가 처리하도록 허용하는 방법은 무엇입니까? 여기에는 스크립트 자체와 직접 실행될 수있는 프로세스가 포함되지만 다시 실행을 예약하려면 at 명령을 사용해야합니다. 기존의 VM이 종료 완료된 후

따라서, 스크립트는 소켓 문제를 무시할 수를 간단히이 수행 내가 가정

at -M now + 0 minutes >/dev/null <<EOF 
java com.my.Server.class & 
EOF 

이미 당신이 때 새를 Socket.setReuseAddress()을 사용해야 할 수도 있음을 알고있다 프로세스가 소켓을 만듭니다.

관련 문제