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