当前位置: 代码网 > 服务器>服务器>Linux > Linux系统查找并终止占用特定端口的进程的完整流程

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

2026年04月20日 Linux 我要评论
问题场景需要终止占用5501端口的进程,但系统中常用的网络命令(如netstat、lsof、ss等)不可用。环境信息操作系统:linux (debian)可用命令:ps、cat、grep、python

问题场景

需要终止占用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查找并终止特定端口的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com