我的Linux 服务器上运行着一个red5 服务器(JAVA)。
有时,服务器会关闭。当我尝试重新启动它时,出现错误:
“绑定错误,此端口已在使用中”。
所以我尝试用killall -9 java杀死服务器 并尝试重新启动服务器:同样的错误。
我必须等待一段时间(大约 2-3 分钟)然后重新启动它:这行得通。
我只需要知道为什么当我终止进程时,我仍然需要等待 2-3 分钟,然后端口 1935 才可用,我可以再次运行服务器。
有没有办法立即终止这个进程并释放端口?
我的Linux 服务器上运行着一个red5 服务器(JAVA)。
有时,服务器会关闭。当我尝试重新启动它时,出现错误:
“绑定错误,此端口已在使用中”。
所以我尝试用killall -9 java杀死服务器 并尝试重新启动服务器:同样的错误。
我必须等待一段时间(大约 2-3 分钟)然后重新启动它:这行得通。
我只需要知道为什么当我终止进程时,我仍然需要等待 2-3 分钟,然后端口 1935 才可用,我可以再次运行服务器。
有没有办法立即终止这个进程并释放端口?
如果您确定您的服务器的旧实例拥有该端口,只需运行jps
,在列表中找到您的服务器 pid 并运行kill -9 my_pid
对于通用的非 java 进程,lsof -i :1935
通常对我有用。再次,获取 pid 并终止此进程。
问题是-9
在杀戮中。
如果您使用 SIGKILL (-9) 终止进程,则该进程将立即终止。因此,该端口保持分配状态,直到(一分钟后)操作系统注意到该问题。在 SIGKILL 之前尝试 SIGHUP 和 SIGINT(按顺序)。
在任何情况下,用于netstat -a -t -p
验证哪个进程获得了端口。
立即处理终止和端口释放:
fuser -k 1935/tcp
如果可能,您应该SO_REUSEADDR
在程序设置其套接字时使用套接字选项。这样,当程序重新启动时,您可以立即重用套接字,而不必等待 2-3 分钟。
有关详细信息,请参阅 javadoc setReuseAddress。尤其:
当 TCP 连接关闭时,连接可能会在连接关闭后的一段时间内保持超时状态(通常称为 TIME_WAIT 状态或 2MSL 等待状态)。对于使用众所周知的套接字地址或端口的应用程序,如果存在涉及套接字地址或端口的处于超时状态的连接,则可能无法将套接字绑定到所需的 SocketAddress。
在使用 bind(SocketAddress) 绑定套接字之前启用 SO_REUSEADDR 允许绑定套接字,即使先前的连接处于超时状态。
kill -9 默认不应该使用。该过程无法清理内部事物。要使用示例端口 8000 杀死应用程序的 pid:
kill $(netstat -nptl | awk '/:8000/{gsub("/.*", ""); print $7}')
这是一个方便的oneliner:
kill $(fuser 1935/tcp)