Linux系统查找并终止占用特定端口的进程的完整流程

 更新时间:2026年04月20日 08:53:32   作者:Java后端的Ai之路  
本文档记录了在Linux系统中如何查找并终止占用特定端口(如5501)的进程的完整流程,适用于需要释放被占用的端口、终止无响应服务或清理异常进程等场景,希望对大家有所帮助

问题场景

需要终止占用5501端口的进程,但系统中常用的网络命令(如netstatlsofss等)不可用。

环境信息

  • 操作系统:Linux (Debian)
  • 可用命令pscatgreppython3等基础命令
  • 目标端口:5501

完整操作流程

第一步:确认端口被占用

使用Python脚本检测端口是否被占用:

python3 -c "
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = sock.connect_ex(('127.0.0.1', 5501))
if result == 0:
    print('Port 5501 is in use')
else:
    print('Port 5501 is not in use')
sock.close()
"

输出结果

Port 5501 is in use

第二步:查找端口对应的Socket Inode

端口号在/proc/net/tcp文件中以十六进制格式存储。5501的十六进制为157D

cat /proc/net/tcp | grep -i 157D

输出结果

   4: 00000000:157D 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 1990512643 1 0000000000000000 100 0 0 10 0                
  25: 0100007F:8562 0100007F:157D 06 00000000:00000000 03:0000085A 00000000     0        0 0 3 0000000000000000

字段解析

字段位置字段名称示例值说明
第1个local_address00000000:157D本地地址(IP:端口),157D = 5501
第2个rem_address00000000:0000远程地址
第3个st0A连接状态(0A=Listening)
第10个inode1990512643Socket Inode(关键字段)

十六进制端口对照表

十进制十六进制
5501157D
220016
800050
44301BB
80801F90

第三步:查找Inode对应的进程PID

遍历所有进程的fd目录,找到对应socket inode的进程:

for pid in $(ls /proc | grep -E '^[0-9]+$'); do
  if [ -d "/proc/$pid/fd" ]; then
    for fd in /proc/$pid/fd/*; do
      if [ -L "$fd" ]; then
        link=$(readlink "$fd" 2>/dev/null)
        if [[ "$link" == *"socket:[1990512643]"* ]]; then
          echo "Found PID: $pid"
          kill -9 $pid 2>/dev/null && echo "Killed process $pid"
        fi
      fi
    done
  fi
done

输出结果

Found PID: 246253
Killed process 246253

第四步:验证端口已释放

python3 -c "
import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = sock.connect_ex(('127.0.0.1', 5501))
if result == 0:
    print('Port 5501 is still in use')
else:
    print('Port 5501 is now FREE')
sock.close()
"

输出结果

Port 5501 is now FREE

原理说明

/proc/net/tcp 文件结构

Linux系统通过 /proc/net/tcp 文件提供TCP连接信息:

sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
  • local_address:本地IP地址和端口
  • inode:Socket inode号,是查找进程的关键
  • st:连接状态(06=TIME_WAIT, 0A=LISTEN, 01=ESTABLISHED)

进程与Socket的关联

Linux中所有进程信息都在/proc/目录下:

  • /proc/[PID]/fd/:进程打开的文件描述符
  • 每个fd是一个指向实际文件或socket的符号链接
  • socket链接格式:socket:[inode_number]

查找流程图

常用替代方法

方法1:使用 lsof(如果可用)

lsof -i :5501
kill -9 $(lsof -t -i :5501)

方法2:使用 netstat(如果可用)

netstat -tlnp | grep 5501
kill -9 <PID>

方法3:使用 ss(如果可用)

ss -tlnp | grep 5501
kill -9 <PID>

方法4:使用 fuser(如果可用)

fuser -k 5501/tcp

方法5:使用泊坞窗(如果可用)

docker ps --format "{{.Ports}}" | grep 5501
docker stop <CONTAINER_ID>

完整Python脚本

以下是一个完整的Python脚本,可以直接使用:

#!/usr/bin/env python3
"""
根据端口号查找并终止对应进程
用法: python3 kill_port.py <端口号>
"""
import subprocess
import sys
import re
def port_to_hex(port):
    """将端口号转换为十六进制"""
    return format(int(port), 'X').zfill(4).upper()
def find_inode(port):
    """查找端口对应的inode"""
    hex_port = port_to_hex(port)
    try:
        with open('/proc/net/tcp', 'r') as f:
            lines = f.readlines()
            for line in lines[1:]:  # 跳过标题行
                parts = line.split()
                if len(parts) > 9:
                    local_addr = parts[1]
                    if f':{hex_port}' in local_addr:
                        return parts[9]
    except Exception as e:
        print(f"Error reading /proc/net/tcp: {e}")
    return None
def find_pid_by_inode(inode):
    """根据inode查找进程PID"""
    try:
        # 遍历所有进程的fd目录
        result = subprocess.run(['ls', '/proc'], capture_output=True, text=True)
        pids = re.findall(r'\d+', result.stdout)
        for pid in pids:
            fd_dir = f'/proc/{pid}/fd'
            try:
                result = subprocess.run(['ls', '-l', fd_dir], capture_output=True, text=True)
                if f'socket:[{inode}]' in result.stdout:
                    return pid
            except:
                continue
    except Exception as e:
        print(f"Error finding PID: {e}")
    return None
def kill_process(pid):
    """终止进程"""
    try:
        subprocess.run(['kill', '-9', pid])
        return True
    except Exception as e:
        print(f"Error killing process: {e}")
        return False
def check_port(port):
    """检查端口是否被占用"""
    import socket
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    result = sock.connect_ex(('127.0.0.1', int(port)))
    sock.close()
    return result == 0
def main():
    if len(sys.argv) != 2:
        print(f"用法: {sys.argv[0]} <端口号>")
        sys.exit(1)
    port = sys.argv[1]
    print(f"正在查找占用端口 {port} 的进程...")
    # 检查端口是否被占用
    if not check_port(port):
        print(f"端口 {port} 未被占用")
        sys.exit(0)
    # 查找inode
    inode = find_inode(port)
    if not inode:
        print(f"无法找到端口 {port} 对应的inode")
        sys.exit(1)
    print(f"找到 inode: {inode}")
    # 查找PID
    pid = find_pid_by_inode(inode)
    if not pid:
        print(f"无法找到占用端口 {port} 的进程")
        sys.exit(1)
    print(f"找到进程 PID: {pid}")
    # 终止进程
    if kill_process(pid):
        print(f"成功终止进程 {pid}")
        # 验证端口已释放
        if not check_port(port):
            print(f"端口 {port} 已成功释放")
        else:
            print(f"警告: 端口 {port} 仍被占用")
    else:
        print(f"终止进程失败")
if __name__ == '__main__':
    main()

使用方法

chmod +x kill_port.py
python3 kill_port.py 5501

注意事项

权限问题:终止进程可能需要root权限,使用sudo或以root用户运行

进程依赖:终止进程可能影响依赖该服务的其他功能

数据保存:确保已保存重要数据,避免强制终止导致数据丢失

系统进程:不要终止系统关键进程(如sshd、supervisord等)

常见问题

Q: 为什么lsof、netstat、ss等命令不可用?

A: 在某些精简的Linux系统中,这些命令默认未安装。可以使用Python脚本作为替代方案。

Q: 如何查看进程信息?

ps aux | grep <PID>
cat /proc/<PID>/cmdline

Q: 如何查看端口对应的服务?

cat /proc/<PID>/comm
cat /proc/<PID>/status

更新日志

日期版本描述
2026-04-191.0初始版本,记录5501端口进程终止流程

以上就是Linux系统查找并终止占用特定端口的进程的完整流程的详细内容,更多关于Linux查找并终止特定端口的资料请关注脚本之家其它相关文章!

相关文章

  • 详解Linux 安装 JDK、Tomcat 和 MySQL(图文并茂)

    详解Linux 安装 JDK、Tomcat 和 MySQL(图文并茂)

    本文会详细介绍 Windows 上安装虚拟机之后,如何在 Linux 中安装 JDK、Tomcat 和 MySQL 的过程,有兴趣的可以了解一下
    2017-08-08
  • Linux使用pt-slave-restart监控多个从库的Shell脚本案例

    Linux使用pt-slave-restart监控多个从库的Shell脚本案例

    本文介绍了如何编写并使用一个基于pt-slave-restart的Shell脚本,实现对多个MySQL从库复制状态的灵活监控,支持多种配置方式、参数覆盖、错误处理及守护进程等功能,便于高效管理数据库复制,需要的朋友可以参考下
    2025-10-10
  • ubuntu中swap(虚拟内存)设置方法

    ubuntu中swap(虚拟内存)设置方法

    这篇文章主要介绍了ubuntu中swap(虚拟内存)设置方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • linux进行硬盘分区挂载的实现方法

    linux进行硬盘分区挂载的实现方法

    这篇文章主要介绍了linux进行硬盘分区挂载的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • linux下cpu飙高原因排查过程详解

    linux下cpu飙高原因排查过程详解

    大家好,本篇文章主要讲的是linux下cpu飙高原因排查过程详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下哦
    2021-11-11
  • Linux环境变量&&进程地址空间详解

    Linux环境变量&&进程地址空间详解

    本文介绍了Linux环境变量、命令行参数、进程地址空间以及Linux内核进程调度队列的相关知识,环境变量是系统运行环境的参数,命令行参数用于传递给程序的参数,进程地址空间是进程的虚拟内存区域,而Linux内核进程调度队列是进程调度的核心数据结构
    2025-02-02
  • Linux内核设备驱动之内核中链表的使用笔记整理

    Linux内核设备驱动之内核中链表的使用笔记整理

    今天小编就为大家分享一篇关于Linux内核设备驱动之内核中链表的使用笔记整理,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • 详解linux pwm驱动编写

    详解linux pwm驱动编写

    这篇文章主要介绍了详解linux pwm驱动编写,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • 我常用的一些linux命令小结

    我常用的一些linux命令小结

    linux命令熟练掌握后对效率提升有多大,这篇文章主要介绍了我常用的一些linux命令小结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • 检查Linux中磁盘使用情况的四种方法

    检查Linux中磁盘使用情况的四种方法

    有时你需要下载一些重要文件或将一些照片传输到你的Linux系统,但面临磁盘空间不足的问题,你前往你的文件管理器删除你不再需要的大文件,但你不知道其中哪些占用了你大部分的磁盘空间,在本文中,我们将展示一些简单的方法来检查Linux中磁盘使用情况
    2025-06-06

最新评论