내 CentOS 시스템에서 실행 중인 게임 서버가 포트 28960에 바인딩되어 있는데 게임 서버를 다시 시작하면 포트가 사용 중이므로 포트를 바인딩할 수 없다는 메시지가 표시됩니다. 하지만 이는 서버가 다시 시작되었기 때문인 것 같습니다. 항구가 닫히지 않았나요? 프로그램이 수신 대기 중인지 어떻게 확인하고, 그렇지 않은 경우 포트 28960에서 서버 백업을 시작할 수 있도록 포트를 지우려면 어떻게 해야 합니까?
답변1
만날 수도 있을 것 같아요2*MSL 문제. 당신은 이렇게 말할 수 있습니다 :
$ netstat -na | grep 28960.*TIME_WAIT
여기서 정보를 얻는다면 이는 커널의 네트워크 스택이 포트 리바인딩을 허용하기 전에 가짜 패킷이 나타날 때까지 최대 세그먼트 수명(MSL)의 두 배를 기다리고 있음을 의미합니다.나라 TIME_WAIT
는 좋은 것입니다.
정상 작동 중에 다시 시작하려는 서버는 TIME_WAIT
다음 설정으로 처리가 비활성화되었습니다.SO_REUSEADDR
콘센트 옵션. 게임 서버의 문서를 보면 이 동작을 활성화할 수 있는 옵션이 있을 수 있습니다.
그렇지 않고 게임 서버를 수정하기 위한 소스를 얻을 수 없는 경우 유일한 옵션은 상태가 TIME_WAIT
만료될 때까지 기다리는 것입니다. 이 작업은 일반적으로 30~120초가 걸립니다.
showwait
이런 종류의 작업에 도움이 되는 스크립트는 다음과 같습니다 .
#!/bin/sh
while [ true ]
do
netstat -na | grep WAIT
sleep 1
done
실행하고 초당 라인 출력이 중지될 때까지 기다리면 됩니다. Ctrl-C그런 다음 대기 상태가 필요하지 않은 작업을 계속 진행할 수 있습니다 .
이 스크립트는 지속적으로 대기하는 바쁜 서버에서 사용하기에는 적합하지 않습니다. 그러나 서버를 기다리고 있고 다른 일이 발생하지 않는 경우에는 적합합니다.
답변2
시도해 볼 수 있습니다 lsof(8)
(맨 페이지를 확인하세요. 상당히 광범위하지만 출력을 전달하는 것만으로도 grep 28960
무슨 일이 일어나고 있는지 알 수 있습니다). 어쨌든 포트 28960은 할당되지 않았습니다.인터넷 할당 번호 기관. 따라서 아무것도 사용해서는 안됩니다.