Contents

正在释放TCP/IP端口

1. 概述

在这个简短的教程中,我们将看到如何通过终止使用它的进程来释放 TCP/IP 端口,我们还将看到对 TCP 状态的介绍。

为此,我们将使用fuser 作为主要方法,然后我们还将看到sslsof 以及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. 找到进程然后杀死它

我们有另一种选择来释放端口。我们可以分两步完成,找出哪个进程正在使用该端口 ,然后终止该进程

要查找进程,我们可以使用lsofss

$ 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:进程关闭连接,端口等待超时

如果端口处于LISTENESTABLISHED状态,我们通过终止使用它的进程来释放它。我们应该考虑到我们将失去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状态,没有任何进程使用它。