Linux端口进程查找与终止教程

张开发
2026/4/20 2:24:26 15 分钟阅读

分享文章

Linux端口进程查找与终止教程
Linux端口进程查找与终止教程文章目录Linux端口进程查找与终止教程概述问题场景环境信息完整操作流程第一步确认端口被占用第二步查找端口对应的Socket Inode第三步查找Inode对应的进程PID第四步验证端口已释放原理说明/proc/net/tcp 文件结构进程与Socket的关联查找流程图常用替代方法方法1使用 lsof如果可用方法2使用 netstat如果可用方法3使用 ss如果可用方法4使用 fuser如果可用方法5使用泊坞窗如果可用完整Python脚本注意事项常见问题Q: 为什么lsof、netstat、ss等命令不可用Q: 如何查看进程信息Q: 如何查看端口对应的服务参考资料更新日志概述本文档记录了在Linux系统中如何查找并终止占用特定端口如5501的进程的完整流程。适用于需要释放被占用的端口、终止无响应服务或清理异常进程等场景。问题场景需要终止占用5501端口的进程但系统中常用的网络命令如netstat、lsof、ss等不可用。环境信息操作系统Linux (Debian)可用命令ps、cat、grep、python3等基础命令目标端口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-i157D输出结果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连接状态0AListening第10个inode1990512643Socket Inode关键字段十六进制端口对照表十进制十六进制5501157D22001680005044301BB80801F90第三步查找Inode对应的进程PID遍历所有进程的fd目录找到对应socket inode的进程forpidin$(ls/proc|grep-E^[0-9]$);doif[-d/proc/$pid/fd];thenforfdin/proc/$pid/fd/*;doif[-L$fd];thenlink$(readlink$fd2/dev/null)if[[$link*socket:[1990512643]*]];thenechoFound PID:$pidkill-9$pid2/dev/nullechoKilled process$pidfifidonefidone输出结果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 inodelocal_address本地IP地址和端口inodeSocket inode号是查找进程的关键st连接状态06TIME_WAIT, 0ALISTEN, 01ESTABLISHED进程与Socket的关联Linux中所有进程信息都在/proc/目录下/proc/[PID]/fd/进程打开的文件描述符每个fd是一个指向实际文件或socket的符号链接socket链接格式socket:[inode_number]查找流程图确认端口被占用读取/proc/net/tcp获取inode遍历/proc/*/fd/查找对应inode找到对应PID使用kill -9终止进程验证端口已释放常用替代方法方法1使用 lsof如果可用lsof-i:5501kill-9$(lsof-t-i:5501)方法2使用 netstat如果可用netstat-tlnp|grep5501kill-9PID方法3使用 ss如果可用ss-tlnp|grep5501kill-9PID方法4使用 fuser如果可用fuser-k5501/tcp方法5使用泊坞窗如果可用dockerps--format{{.Ports}}|grep5501dockerstopCONTAINER_ID完整Python脚本以下是一个完整的Python脚本可以直接使用#!/usr/bin/env python3 根据端口号查找并终止对应进程 用法: python3 kill_port.py 端口号 importsubprocessimportsysimportredefport_to_hex(port):将端口号转换为十六进制returnformat(int(port),X).zfill(4).upper()deffind_inode(port):查找端口对应的inodehex_portport_to_hex(port)try:withopen(/proc/net/tcp,r)asf:linesf.readlines()forlineinlines[1:]:# 跳过标题行partsline.split()iflen(parts)9:local_addrparts[1]iff:{hex_port}inlocal_addr:returnparts[9]exceptExceptionase:print(fError reading /proc/net/tcp:{e})returnNonedeffind_pid_by_inode(inode):根据inode查找进程PIDtry:# 遍历所有进程的fd目录resultsubprocess.run([ls,/proc],capture_outputTrue,textTrue)pidsre.findall(r\d,result.stdout)forpidinpids:fd_dirf/proc/{pid}/fdtry:resultsubprocess.run([ls,-l,fd_dir],capture_outputTrue,textTrue)iffsocket:[{inode}]inresult.stdout:returnpidexcept:continueexceptExceptionase:print(fError finding PID:{e})returnNonedefkill_process(pid):终止进程try:subprocess.run([kill,-9,pid])returnTrueexceptExceptionase:print(fError killing process:{e})returnFalsedefcheck_port(port):检查端口是否被占用importsocket socksocket.socket(socket.AF_INET,socket.SOCK_STREAM)resultsock.connect_ex((127.0.0.1,int(port)))sock.close()returnresult0defmain():iflen(sys.argv)!2:print(f用法:{sys.argv[0]}端口号)sys.exit(1)portsys.argv[1]print(f正在查找占用端口{port}的进程...)# 检查端口是否被占用ifnotcheck_port(port):print(f端口{port}未被占用)sys.exit(0)# 查找inodeinodefind_inode(port)ifnotinode:print(f无法找到端口{port}对应的inode)sys.exit(1)print(f找到 inode:{inode})# 查找PIDpidfind_pid_by_inode(inode)ifnotpid:print(f无法找到占用端口{port}的进程)sys.exit(1)print(f找到进程 PID:{pid})# 终止进程ifkill_process(pid):print(f成功终止进程{pid})# 验证端口已释放ifnotcheck_port(port):print(f端口{port}已成功释放)else:print(f警告: 端口{port}仍被占用)else:print(f终止进程失败)if__name____main__:main()使用方法chmodx kill_port.py python3 kill_port.py5501注意事项权限问题终止进程可能需要root权限使用sudo或以root用户运行进程依赖终止进程可能影响依赖该服务的其他功能数据保存确保已保存重要数据避免强制终止导致数据丢失系统进程不要终止系统关键进程如sshd、supervisord等常见问题Q: 为什么lsof、netstat、ss等命令不可用A: 在某些精简的Linux系统中这些命令默认未安装。可以使用Python脚本作为替代方案。Q: 如何查看进程信息psaux|grepPIDcat/proc/PID/cmdlineQ: 如何查看端口对应的服务cat/proc/PID/commcat/proc/PID/status参考资料Linux内核文档/proc/net/tcpPython官方文档socket - 网络通信更新日志日期版本描述2026-04-191.0初始版本记录5501端口进程终止流程

更多文章