Linux:如何杀死使用端口1935的程序?

时间:2010-10-16 12:50:50

标签: java linux port red5 kill-process

我的Linux服务器上运行了red5 server(JAVA)。

有时,服务器会关闭。当我尝试重新启动它时出现错误:

“绑定错误,此端口正在使用中”。

所以我尝试使用 killall -9 java 来杀死服务器 并尝试重新启动服务器:同样的错误。

我必须等待一段时间(大约2-3分钟)并重新启动它:这有效。

我只需要知道为什么当我终止这个过程时,我仍需要等待2-3分钟才能使1935端口空闲并且我可以再次运行服务器。

有没有办法立即终止此进程并释放端口?

6 个答案:

答案 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)