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

yar*_*rek 9 java linux port red5 kill-process

我的Linux服务器上运行了一个red5服务器(JAVA).

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

"绑定错误,此端口正在使用中".

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

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

我只需要知道为什么当我杀死进程时,我仍然需要等待2-3分钟才能使端口1935空闲并且我可以再次运行服务器.

有没有办法立即杀死这个进程并释放端口?

Nik*_*bak 17

如果您确定服务器的旧实例拥有端口,只需运行jps,在列表中找到您的服务器pid并运行kill -9 my_pid

对于通用的非java进程,lsof -i :1935通常适合我.再次,采取pid并杀死这个过程.


and*_*coz 9

问题在于-9杀人.

如果使用SIGKILL(-9)终止进程,则立即终止进程.因此,端口保持分配,直到(几分钟后)操作系统注意到问题.在SIGKILL之前尝试SIGHUP和SIGINT(按顺序).

在任何情况下,用于netstat -a -t -p验证哪个进程已获取端口.


Ale*_*ruk 7

立即处理终止和端口释放:

 fuser -k 1935/tcp
Run Code Online (Sandbox Code Playgroud)


Jus*_*ier 5

如果可能,应SO_REUSEADDR在程序设置套接字时使用套接字选项.这样,您可以在程序重新启动时立即重用套接字,而不必等待2-3分钟.

有关更多信息,请参阅javadoc setReuseAddress.特别是:

当TCP连接关闭时,连接可能在连接关闭后的一段时间内保持超时状态(通常称为TIME_WAIT状态或2MSL等待状态).对于使用众所周知的套接字地址或端口的应用程序,如果在涉及套接字地址或端口的超时状态中存在连接,则可能无法将套接字绑定到所需的SocketAddress.

在使用bind(SocketAddress)绑定套接字之前启用SO_REUSEADDR允许套接字绑定,即使先前的连接处于超时状态.