商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 系统应用 > Linux查看端口占用情况 常用命令lsof和netstat【教程】

Linux查看端口占用情况 常用命令lsof和netstat【教程】

  发布于2026-05-21 阅读(0)

扫一扫,手机访问

排查端口占用,是Linux系统管理和开发调试中的高频操作。面对lsofnetstatss这几个命令,新手往往一头雾水。其实,选择很简单:首选lsof -i :端口号,如果系统没装,就用ss -tulnp;至于netstat,它已经逐步被弃用,新环境不建议依赖。

Linux查看端口占用情况 常用命令lsof和netstat【教程】

为什么 lsof -i :8000 是首选

这个命令的优势在于信息完整且“一镜到底”。它不仅能告诉你端口被谁占了,还能一次性展示进程名、PID、所属用户、协议类型以及监听地址,对UDP或IPv6这类容易遗漏的监听项也识别得很准。

举个例子,查询8000端口:

lsof -i :8000
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nodejs  26993 root   10u  IPv4 37999514      0t0  TCP *:http-alt (LISTEN)

解读这个结果,有几个细节值得注意:

  • 权限是关键lsof -i通常需要sudo提权,否则你只能看到自己用户启动的进程,系统服务或其他用户的进程会“隐身”。
  • 非默认安装:在CentOS或RHEL等系统上,lsof并非预装,得先执行yum install -y lsof
  • 输出字段FD列里的u表示该socket可读写;TYPE列明确区分了IPv4IPv6
  • 精准过滤:如果只想看TCP的监听状态,可以用更精确的命令:lsof -nP -iTCP -sTCP:LISTEN | grep :8000。这里的-n-P参数能跳过DNS解析、直接显示端口号,让结果更清晰。

netstat -tunlp 还能用吗

当然能用,尤其在老系统上。但心里得有数:它正被ss命令取代。像Ubuntu 22.04或AlmaLinux 9这些较新的发行版,默认已经不装netstat了,想用得自己安装net-tools包。

它的典型用法是配合grep

netstat -tunlp | grep :8000
tcp        0      0 *:8000               *:*                   LISTEN      26993/nodejs

不过,用netstat时下面这几个“坑”很容易踩到:

  • -p参数离不开sudo:不加sudo,PID和进程名那列就只显示一个孤零零的-,等于白查。
  • 参数顺序有讲究netstat -tunlp没问题,但换成netstat -p -tunl在某些版本可能就会报错。
  • UDP监听可能漏报:在识别UDP端口监听状态时,netstat的表现不如lsof稳定,有时会查不到。

更现代的替代方案:ss -tulnp

如果说netstat是老兵,那ss(socket statistics)就是全面接班的现代装备。它直接从内核获取信息,速度更快,输出也更简洁明了,几乎已是现代Linux发行版的标配。

同样查8000端口:

ss -tulnp | grep :8000
LISTEN 0   128   *:8000   *:*   users:(("nodejs",pid=26993,fd=10))

netstat对比一下:

  • 参数一脉相承-t(TCP)、-u(UDP)、-l(监听)、-n(不解析)、-p(显示进程),学习成本很低。
  • 输出更直观:进程信息直接整合在users:(...)括号里,比netstat那种需要对齐多列来看的方式更友好。
  • 专注网络ss专注于socket统计,不像lsof能查文件路径,但用于端口排查完全够用。
  • 同样需要权限:如果看到“Permission denied”,记得加上sudo,特别是用了-p选项时。

查到 PID 后怎么安全终止进程

找到“罪魁祸首”只是第一步,安全地“清理现场”更重要。切忌一上来就祭出kill -9这个大杀器。正确的流程应该是:

  • 先确认身份:用ps -p PID -o pid,user,comm,args(例如ps -p 26993 -o pid,user,comm,args)看清楚进程的详细信息,确认是不是可以结束的测试进程,而不是正在运行的数据库或关键服务。
  • 先礼后兵:对于普通的开发进程(比如本地npm start),先用kill PID发送默认的TERM信号,允许程序做退出前的清理工作。
  • 强制手段备用:如果进程无响应,再使用kill -9 PID(SIGKILL信号)强制结束。
  • 一键清场(慎用)fuser 8000/tcp -k命令能直接结束所有占用该端口的进程,非常干脆,但范围不可控,需谨慎。
  • 最后验证:操作完成后,务必再次执行lsof -i :8000ss -tuln | grep :8000,确认端口确实已经释放。

这里最常出问题的地方是权限和误杀。不加sudo可能查不到也杀不掉;但滥用sudo kill -9,又可能误杀关键服务(比如SSH守护进程),导致服务器失联。所以,动手前多看一眼,总是没错的。

本文转载于:https://www.php.cn/faq/2444971.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注