TL;DR
端口问题三步走:ss -tlnp 看监听,lsof -i :端口 找占用者,ps -p PID -o pid,cmd 确认身份后再 kill。
查看监听端口
| 操作 | 命令 |
|---|---|
| 所有 TCP 监听及进程 | ss -tlnp |
| 只看某端口 | ss -tlnp 'sport = :8080' |
| 旧命令替代 | netstat -tlnp |
| 查看 UDP | ss -ulnp |
找进程
| 操作 | 命令 | |
|---|---|---|
| 谁占用了端口 | lsof -i :8080 | |
| 按名字找进程 | pgrep -f 关键字 | |
| 查看进程详情 | ps -p PID -o pid,user,cmd | |
| 完整列表过滤 | `ps aux | grep 关键字` |
处理进程
| 操作 | 命令 |
|---|---|
| 正常终止 | kill PID |
| 强制终止 | kill -9 PID |
| 按名字终止 | pkill -f 关键字 |
排查要点
- 127.0.0.1 监听 = 仅本机可访问;0.0.0.0 /
*= 对外暴露; ss里看不到进程名,通常是权限不足,加sudo;- 杀进程前先确认 PID 对应关系,避免误杀系统服务。
常见问题
怎么查看 8080 端口被哪个进程占用?
ss -tlnp 'sport = :8080';看不到进程名就加 sudo。老系统用 netstat -tlnp,或用 lsof -i :8080。
ss 看不到进程名怎么办?
通常是权限不足:ss -tlnp 需要 root 才能显示进程名,用 sudo ss -tlnp。
端口被占用怎么杀掉进程?
先 lsof -i :端口 或 ss -tlnp 拿到 PID,用 ps -p PID -o pid,cmd 确认是什么进程,再 kill PID;确认无误杀风险才用 kill -9 PID。
怎么判断端口是不是对外开放的?
看监听地址:127.0.0.1 只允许本机;0.0.0.0 或 * 监听所有网卡,外部可访问。再从外部机器 nc -vz 服务器IP 端口 验证。
netstat 和 ss 有什么区别?
ss 是 netstat 的现代替代,更快且 root 下默认显示进程;netstat 属于 net-tools,老系统还在用,两者参数基本一致。
来源
- Linux man pages(ss / lsof / ps / kill)