CPU占用100%定位恶意进程查杀教程
服务器CPU飙到100%?三步定位恶意进程并查杀
服务器 CPU 突然飙到 100%,SSH 都卡得打不出字?
不要急着重启,先按下面的流程找出那个“吃满 CPU”的恶意进程,然后安全地干掉它。
本文假设你只会最基本的 Linux 命令,全程可复制执行。
第一步:远程连接并观察系统负载
首先通过 SSH 连接你的服务器(用公司的堡垒机或密钥方式登录)。
连上后先跑两个命令看看整体状态:
top -bn1 | head -15
这个命令会一次性输出 top 的截图,重点关注 %Cpu(s) 那行和后面的 PID USER PR NI ... 列表。
如果某个进程的 %CPU 长期超过 90%,它很可能就是问题进程。
如果觉得 top 输出乱糟糟,可以用 htop(更直观,需要先安装):
apt install htop -y # Ubuntu/Debian
yum install htop -y # CentOS
htop
htop 里按 F6 可以按 CPU 使用率排序,一眼就能看到哪个进程最吃资源。
记录下这个进程的 PID(进程号)。
第二步:确认进程身份,查清“底细”
拿到 PID 后千万不要直接 kill -9,先搞清楚它到底是系统必须的服务还是一个挖矿恶意程序。
用下面几个命令交叉检查:
# 查看进程详细信息
ps -p -o pid,ppid,%cpu,%mem,cmd,user
# 查看该进程打开的文件/网络连接
lsof -p
# 检查网络连接(如果没有 lsof 可以用 netstat 或 ss)
ss -tunap | grep
重点关注:
- User 是否为 root 或 www-data 等系统用户?如果是一个奇怪的用户名(比如 xmrig、miner、tmp 等),基本可以判定是恶意进程。
- Cmd 是否指向一个可疑路径,比如
/tmp/...或/var/tmp/...下的随机名字文件? - 网络连接:如果有大量对外连接,尤其是目标 IP 是海外矿池地址,那就是挖矿木马。
第三步:安全地停止并清理恶意进程
确认是恶意进程后,按照“先暂停、再终止、最后清理文件”的顺序操作。
# 1. 先发送 SIGTERM 让进程自行退出(有机会处理资源)
kill
sleep 2
# 2. 如果没退出再用 SIGKILL 强制干掉
kill -9
# 3. 找到恶意程序文件删除(根据上面 lsof 或 ps 里看到的路径)
rm -f /tmp/.X11-unix/xxx # 举例路径,以实际为准
重要提醒:有些恶意进程会设置定时任务(cron)或写启动脚本,只杀进程不删文件,过几分钟又会复活。
所以必须同时检查并清理:
# 查看当前用户的 crontab
crontab -l
# 查看系统级 crontab
cat /etc/crontab
ls -la /etc/cron.*/
如果发现定时任务里有下载脚本或执行可疑文件的条目,直接删除那一行。
另外检查 /etc/rc.local、/etc/init.d/ 等自启动目录是否被写入。
避坑指南与高频问题
问题1:怎么判断是恶意进程而不是正常的系统进程?
正常进程如 mysqld、php-fpm、nginx 等,用户通常为 mysql、www-data,命令路径在 /usr/sbin/ 或 /usr/bin/ 下,且网络连接正常。
恶意进程通常随机名字、路径在 /tmp 或 /dev/shm、用户为 nobody 或奇怪名。
问题2:杀不掉进程怎么办(无权限、僵尸进程)?
如果是 root 用户也杀不掉,可能是进程进入了 D 状态(不可中断睡眠)。
这时只能重启服务器。
重启前最好把可能的恶意文件提前备份并删除。
问题3:忘了记录 PID 就关掉了 top 怎么办?
可以再跑 ps aux --sort=-%cpu | head 按 CPU 降序列出前几个进程,同样能找到高占用进程。
问题4:做完以上步骤后 CPU 还高?
可能有多个恶意进程隐藏在系统里,或者系统真的被挖矿程序植入了内核模块。
此时建议安装杀毒工具如 ClamAV 全盘扫描,或者直接用 rkhunter 检查 rootkit。
最后验证效果
清理完所有可疑进程和文件后,再次运行 top 或 htop,观察 CPU 空闲百分比是否恢复到正常水平(比如 id 值 >90%)。
也可以执行 uptime 看 load average 是否下降。
如果过一段时间又复现,说明有遗漏的持久化机制(比如写入了 boot 脚本、内核模块),需要更彻底的排查。
建议结合 auditd 监控新增进程和文件变化。
遇到类似问题时别慌,按照本文的流程一步步操作,大部分恶意进程都能被精准定位并清除。
如果你在处理 CPU 占用 100% 时还有特殊场景,欢迎在评论区留言交流。