Linux查看端口占用情况 常用命令lsof和netstat【教程】
排查Linux端口占用时,首选`lsof-i:端口号`,它能完整显示进程、用户及协议信息。若系统未安装lsof,可使用`ss-tulnp`作为现代替代方案。传统命令`netstat`已逐渐被弃用,在新环境中不建议依赖。查到占用进程的PID后,应先确认其身份,尝试用`killPID`正常终止,无响应时再考虑`kill-9`强制结束,操作后需验证端口是否释放。
排查端口占用,是Linux系统管理和开发调试中的高频操作。面对lsof、netstat、ss这几个命令,新手往往一头雾水。其实,选择很简单:首选lsof -i :端口号,如果系统没装,就用ss -tulnp;至于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列明确区分了IPv4或IPv6。 - 精准过滤:如果只想看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 :8000或ss -tuln | grep :8000,确认端口确实已经释放。
这里最常出问题的地方是权限和误杀。不加sudo可能查不到也杀不掉;但滥用sudo kill -9,又可能误杀关键服务(比如SSH守护进程),导致服务器失联。所以,动手前多看一眼,总是没错的。


































