正在释放TCP/IP端口
1. 概述
在这个简短的教程中,我们将看到如何通过终止使用它的进程来释放 TCP/IP 端口,我们还将看到对 TCP 状态的介绍。
为此,我们将使用fuser 作为主要方法,然后我们还将看到ss 和lsof 以及kill 。这些程序通常默认安装。如果不是,我们可以使用包管理器 来获取它们。
我们需要是root或使用sudo 来访问有关系统的所有信息并杀死进程。
2. 使用fuser释放端口
我们可以使用fuser来显示信息并使用端口终止进程。这样,当进程完成时,端口将可以自由使用。
用法很简单,我们以port/tcp的形式指定端口,加上*-k*会杀掉进程:
$ fuser -k 8000/tcp
8000/tcp: 1479
fuser向我们展示了正在使用该端口的 PID。现在进程被杀死了,如果我们运行fuser 8000/tcp什么都不会出现:
$ fuser -k 8000/tcp
我们可以使用更多参数:
- -i : fuser在终止进程之前要求我们确认
- -SIGNAL:它向进程发送SIGNAL,默认情况下fuser使用SIGKILL ( -KILL )
- -l:它列出了所有可与参数*-SIGNAL一起使用的信号*
这样,我们可以更加小心并在请求确认时使用 SIGTERM:
$ fuser -i -TERM -k 8000/tcp
8000/tcp: 1479
Kill process 7818 ? (y/N) y
3. 找到进程然后杀死它
我们有另一种选择来释放端口。我们可以分两步完成,找出哪个进程正在使用该端口 ,然后终止该进程 。
要查找进程,我们可以使用lsof或ss:
$ lsof -i :8000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
tracd 1479 trac 3u IPv4 6402151 0t0 TCP *:8000 (LISTEN)
$ ss -apt 'sport = :8000'
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 5 *:8000 *:* users:(("tracd",pid=1479,fd=3))
现在我们知道 PID 1479 正在使用该端口,所以我们将其杀死:
$ kill 1479
4. TCP 状态
当我们使用 TCP 时,套接字与一个端口相关联,它不能在其他进程之间共享。
让我们快速浏览一些 TCP 状态:
- LISTEN:服务器正在监听端口,接受新连接
- ESTABLISHED:客户端和服务器之间存在连接
- TIME-WAIT:进程关闭连接,端口等待超时
如果端口处于LISTEN或ESTABLISHED状态,我们通过终止使用它的进程来释放它。我们应该考虑到我们将失去ESTABLISHED连接。
有时没有任何进程在使用该端口,即便如此,系统仍会告诉我们该端口正忙或正在使用中。这通常是因为TIME -WAIT状态。如果是这种情况,我们只需要等到系统释放它,默认超时为 2 分钟。
当使用端口的进程完成或我们终止它时,端口可能会进入TIME-WAIT状态。此行为取决于软件如何使用套接字。 要查看是否有端口处于TIME-WAIT状态,我们可以使用ss和参数*-apt*:
$ ss -apt
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 128 *:ssh *:* users:(("sshd",pid=1226,fd=3))
tcp LISTEN 0 5 127.0.0.1:ipp *:* users:(("cupsd",pid=1303,fd=9))
tcp LISTEN 0 5 *:8000 *:* users:(("tracd",pid=1479,fd=3))
tcp TIME-WAIT 0 0 192.168.0.4:56886 192.168.0.5:https
我们可以看到端口 56886 处于TIME-WAIT状态,没有任何进程使用它。