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查找并终止特定端口的资料请关注脚本之家其它相关文章!

相关文章

  • CentOS下tar打包解压详解(解压到指定文件夹)

    CentOS下tar打包解压详解(解压到指定文件夹)

    本篇文章主要介绍了CentOS下tar打包解压,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • 如何在Linux系统中进行CPU、内存、磁盘和网卡的性能测试?

    如何在Linux系统中进行CPU、内存、磁盘和网卡的性能测试?

    文章详细介绍了如何在Linux系统中进行CPU、内存、磁盘和网卡的性能测试,通过dd命令、fio工具和iostat工具等展示了CPU压力测试、内存使用情况、磁盘I/O性能以及网络流量监控的方法,同时,文章讨论了不同测试工具的使用参数和指标,提供了具体的命令行示例
    2026-02-02
  • Linux终端执行shell脚本,提示权限不够的问题及解决

    Linux终端执行shell脚本,提示权限不够的问题及解决

    这篇文章主要介绍了Linux终端执行shell脚本,提示权限不够的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 如何linux环境下配置环境变量过程图解

    如何linux环境下配置环境变量过程图解

    这篇文章主要介绍了如何linux环境下配置环境变量过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • 详解Linux下挂载新硬盘方法

    详解Linux下挂载新硬盘方法

    这篇文章主要介绍了详解Linux下挂载新硬盘方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Linux内核设备驱动之Linux内核基础笔记整理

    Linux内核设备驱动之Linux内核基础笔记整理

    今天小编就为大家分享一篇关于Linux内核设备驱动之Linux内核基础笔记整理,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Linux服务器磁盘空间占用情况分析与清理指南(解决方法)

    Linux服务器磁盘空间占用情况分析与清理指南(解决方法)

    为防止节假日期间服务器磁盘占用过高引起报警,需在节前检查并清理磁盘,检查条件包括使用率超90%、剩余空间不足30G等,通过shell脚本自动判断并输出异常信息,脚本及使用方法详细介绍,感兴趣的朋友一起看看吧
    2024-09-09
  • 使用Linux的read和write系统函数操作文件的方法详解

    使用Linux的read和write系统函数操作文件的方法详解

    在Linux系统编程中,文件操作是非常基础且重要的部分,Linux提供了多个系统调用来实现文件的读写操作,其中read和write是最常用的两个函数,本文将详细介绍这两个系统调用的功能、使用方法以及实际应用中的注意事项,需要的朋友可以参考下
    2025-10-10
  • linux防火墙配置教程之允许转发实验(2)

    linux防火墙配置教程之允许转发实验(2)

    这篇文章主要为大家详细介绍了linux防火墙配置教程之允许转发的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Linux Windows之wsl安装使用及说明

    Linux Windows之wsl安装使用及说明

    本文详细介绍了如何在Windows 10或11上配置和使用WSL(Windows Subsystem for Linux),包括前期准备、基本配置、命令行简介以及安装VSCode插件等步骤
    2025-11-11

最新评论