正确答案是c,即ss -lp命令可同时列出监听端口及对应进程名,其中-l筛选监听状态,-p通过/proc关联进程信息,需sudo权限才能显示pid和程序名。

ss 命令查端口最快,但得加 -p 才能看进程
直接运行 ss -tuln 只能看到监听状态和端口,看不到 PID 和程序名——这不是漏了,是默认不显示进程信息,因为需要读取 /proc 下的文件,必须有权限。所以真正要定位进程,得加 -p 并用 sudo:
-
sudo ss -tulnp | grep :8080—— 查 8080 端口,输出里会有pid=1234,program=nginx这样的字段 - 如果提示
Permission denied,说明没加sudo;如果没输出,可能是端口根本没在监听(比如服务没起来,或绑定了127.0.0.1但你查的是0.0.0.0) -
ss不解析主机名和服务名,比netstat快,适合脚本或频繁检查
lsof -i :端口号 是最直观的写法,但得先装
lsof 默认不预装在最小化系统(如 Alpine、某些 Docker 镜像)里,报 command not found 就得先装:
- Debian/Ubuntu:
sudo apt install -y lsof - RHEL/CentOS:
sudo yum install -y lsof或sudo dnf install -y lsof - 装完直接用:
sudo lsof -i :3306,输出第一列是COMMAND,第二列是PID,一目了然 - 加
-t可只输出 PID:sudo lsof -t -i :3306,方便管道给kill
fuser 一键杀进程最狠,但容易误杀
fuser 不查连接详情,只管“谁占着”,适合紧急释放端口,但风险高:
-
sudo fuser 8080/tcp输出类似8080/tcp: 1234,就是 PID -
sudo fuser -k 8080/tcp直接 kill,等价于kill -9 1234 - 注意:如果多个进程共用一个端口(如 systemd socket 激活的服务),
-k会全干掉,可能连带杀死父服务管理进程 - 加
-v先看清楚:sudo fuser -v 8080/tcp,确认是不是你要杀的那个
kill -9 要谨慎,优先试 kill 再试 kill -9
很多进程收到 SIGTERM(默认 kill)会主动清理资源、关闭连接、释放端口;而 kill -9 是 SIGKILL,进程来不及收尾,端口可能仍处于 TIME_WAIT 或残留状态:
- 先试温和的:
sudo kill 1234,等几秒再查端口是否释放 - 没反应再升级:
sudo kill -9 1234 - 如果
kill -9后端口还在,大概率是内核还没回收 socket,不是进程没死——等 30~60 秒或重启网络栈(sudo systemctl restart networking)
ss 和 lsof 配合用最稳;fuser -k 留给救火时刻;kill -9 不是银弹,它解决的是“进程卡死”,不是“端口没释放”。











