我的 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 都未被分配互联网号码分配机构。所以什么都不应该使用它。