发布于2026-05-21 阅读(0)
扫一扫,手机访问
排查端口占用,是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提权,否则你只能看到自己用户启动的进程,系统服务或其他用户的进程会“隐身”。lsof并非预装,得先执行yum install -y lsof。FD列里的u表示该socket可读写;TYPE列明确区分了IPv4或IPv6。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在某些版本可能就会报错。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能查文件路径,但用于端口排查完全够用。sudo,特别是用了-p选项时。找到“罪魁祸首”只是第一步,安全地“清理现场”更重要。切忌一上来就祭出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守护进程),导致服务器失联。所以,动手前多看一眼,总是没错的。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
4
5
6
7
8
9