端口与进程监控:使用 ss、netstat、ps 揪出占用的程序
服务器端口被占用、服务起不来、连接超时——这些是运维日常里最常见的报错。别慌,这篇 Linux 教程直接教你怎么用 `ss`、`netstat` 和 `ps` 这三把刀,一分钟定位哪个程序在作妖。主机选的老运维经验告诉你,搞清端口和进程的关系,能省下你大半天的排障时间。

为什么端口被占用时不能只靠重启?
很多新手遇到端口冲突,第一反应是重启服务或者重启服务器。但重启治标不治本,真正的问题可能是某个进程僵死、或者另一个服务悄悄占用了端口。你必须先找出是哪个 PID(进程 ID)在监听这个端口,才能对症下药。
使用 ss 命令快速定位监听端口和进程
`ss` 是 `netstat` 的现代替代品,性能更好,输出更干净。绝大多数现代 Linux 发行版都默认自带。
查看所有监听中的 TCP 端口
ss -tlnp
-t 显示 TCP 端口,-l 只显示监听状态,-n 不解析服务名,-p 显示占用进程
这条命令会输出类似这样的信息:
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:((“sshd”,pid=1234,fd=3))
关键看最后一列 `Process`,直接告诉你进程名是 `sshd`,PID 是 1234。如果某个端口显示 `-` 或者 `users:((“”))`,说明进程已经退出但端口还挂着,多半是僵尸连接。
排查指定端口是否被占用
ss -tlnp | grep :80
只过滤出 80 端口的信息
如果输出为空,说明 80 端口没被监听。如果输出了,直接看 PID 去 `ps` 里查。
使用 netstat 命令排查老旧系统上的端口占用
如果你用的是 CentOS 6 或者更老的系统,`ss` 可能不好使,那就用 `netstat`。先确认有没有装:
netstat -tlnp
参数和 ss 基本一致,-p 同样显示 PID/程序名
注意:`netstat` 在部分新系统上需要手动安装(`yum install net-tools` 或 `apt install net-tools`)。
实战:发现端口被占用但不知道是谁
netstat -tlnp | grep :3306
假设 MySQL 的 3306 端口起不来
输出可能是:
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 5678/mysqld
PID 是 5678,程序是 `mysqld`。如果这里显示 `-` 或者看不到程序名,说明进程已经死了,但操作系统还没释放端口。这时候需要手动杀掉残留连接。
使用 ps 命令深入分析占用端口的进程
`ss` 和 `netstat` 只能告诉你谁在占端口,但进程到底在干嘛、资源占了多少,还得靠 `ps`。
查看进程的详细状态和资源消耗
ps -p 5678 -o pid,ppid,user,%cpu,%mem,cmd –no-headers
-p 指定 PID,-o 自定义输出列
这条命令会输出类似:
5678 1 mysql 0.5 2.3 /usr/sbin/mysqld –basedir=/usr
重点关注 `%cpu` 和 `%mem`,如果某个进程 CPU 跑到 100%,端口卡住就不奇怪了。
找到僵尸进程并清理
ps aux | grep Z
Z 代表僵尸进程状态
僵尸进程不释放端口,但也不响应信号。如果发现端口被僵尸占着,直接 `kill -9` 父进程(PPID)才能彻底清理。
老鸟叮嘱:不要直接 kill -9 所有占用端口的进程
很多教程教人 `kill -9` 杀端口,但这是高危操作。`kill -9` 直接强制终止进程,可能造成数据丢失或文件损坏。正确的做法是:
1. 先用 `ss` 或 `netstat` 找到 PID。
2. 用 `kill -15`(SIGTERM)优雅关闭进程,给它时间清理资源。
3. 如果 `kill -15` 无效,再用 `kill -9`。
万一报错了别慌,先查进程状态,再决定怎么杀。
FAQ:端口与进程监控常见问题
Linux SSH 连不上怎么办?
先检查 SSH 端口(默认22)是否被其他进程占用,用 `ss -tlnp | grep :22` 查看。如果没输出,说明 SSH 服务没起来;如果输出显示其他程序占用了22端口,比如某个 Web 服务,那就得改端口或停掉冲突服务。
VPS 防火墙端口放行后还是访问不了是什么原因?
防火墙放行只是第一步。你还需要确认端口是否在监听状态,用 `ss -tlnp | grep <端口号>` 检查。如果没监听,说明服务没启动或者启动失败。另外,检查云服务商的安全组规则是否也放行了该端口。
Linux 小白可以直接用 root 账号操作吗?
可以,但强烈不建议。root 权限太大,误操作可能直接搞崩系统。日常排查端口和进程,用普通用户配合 `sudo` 就够了。比如 `sudo ss -tlnp` 就能看所有进程信息。
BBR 开启后为什么速度没有明显提升?
BBR 只优化 TCP 拥塞控制,不解决端口被占、进程卡死、磁盘 I/O 高这类问题。先用 `ss` 和 `ps` 检查网络连接状态和进程资源占用,如果端口被僵尸进程堵住,BBR 再好也白搭。
如何杀掉占用端口的进程而不影响其他服务?
先用 `ps -p <PID> –forest` 查看进程树,确认它没有子进程或关联服务。然后优先用 `kill -15 <PID>` 优雅关闭。如果进程是系统关键服务(如 sshd、nginx),杀之前先确认有备用方案。
ss 和 netstat 哪个更推荐日常使用?
推荐 `ss`,因为它是内核直接读取 socket 信息,性能高、输出快,而且默认安装。`netstat` 在老旧系统上还有用武之地,但新系统上已经逐渐被淘汰。主机选的 Linux 教程里,我基本只用 `ss`。
转载请注明出处:https://www.zhujixuan.com/jishujiaocheng/9399.html 商家投稿邮箱:zhujixuanblog@qq.com
