当前位置:首页>Linux>Linux 进程管理实战:ps/top/kill 命令组合拳,服务器卡顿时这样救急

Linux 进程管理实战:ps/top/kill 命令组合拳,服务器卡顿时这样救急

  • 2026-09-02 19:14:16
Linux 进程管理实战:ps/top/kill 命令组合拳,服务器卡顿时这样救急

最近有时间,整理了部分关于linux运维的相关文章,希望可以帮助一些小白入手,但还是老话长谈,无论是优化还是修改配置一定一定一定要先备份好,不然改错真的很麻烦,今儿在聊聊其他Linux命令的组合拳,照着做,服务器再卡也不慌。


先搞清楚:服务器卡顿时第一步该干嘛?

很多新手一看到服务器卡,第一反应是重启。大错特错!重启能解决一时,但你永远不知道是什么把服务器搞挂的。下次还卡,你总不能天天重启吧?

正确的姿势是这样的:

# 第一步:看整体负载uptime

输出示例:

15:30:22 up 45 days,  3:22,  1 user,  load average: 8.52, 6.31, 4.89

重点看 load average 这三个数:

  • 第一个数:最近 1 分钟的平均负载
  • 第二个数:最近 5 分钟的平均负载
  • 第三个数:最近 15 分钟的平均负载

判断标准: 如果负载数值 > CPU 核心数,说明服务器已经过载了。比如你是 4 核 CPU,负载超过 4 就要警惕了。

找出罪魁祸首:谁在吃资源?

 用 top 命令实时查看

top

进入 top 界面后,按几个快捷键:

  • 按 P:按 CPU 使用率排序(默认就是这个)
  • 按 M:按内存使用率排序
  • 按 N:按 PID 排序
  • 按 q:退出

重点关注这几列:

  • PID
    :进程 ID,等下要用它杀进程
  • %CPU
    :CPU 占用率
  • %MEM
    :内存占用率
  • COMMAND
    :进程名,看看到底是哪个程序在作妖

 用 ps 命令静态查看

如果你想把进程信息保存下来分析,用 ps:

# 按 CPU 使用率排序,显示前 10 个进程ps aux --sort=-%cpu | head -n 11# 按内存使用率排序,显示前 10 个进程ps aux --sort=-%mem | head -n 11

输出示例:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMANDroot      1234 85.2  2.1 256789 43210 ?        R    10:00  12:34 javawww-data  5678 12.3  8.5 512345 172340 ?       S    09:00   3:21 php-fpmmysql     9012  8.7 15.2 1024567 309876 ?      S    08:00  45:12 mysqld

老哥经验: 如果看到某个进程 CPU 长期超过 80%,或者内存占用异常高,大概率就是它了。


精准打击:优雅地结束问题进程

找到问题进程后,别急着 kill -9。杀进程也是有讲究的。

 先尝试温柔地终止

# 发送 SIGTERM 信号,让进程自己清理后退出kill 1234

等个几秒钟,检查进程还在不在:

ps -p 1234

如果进程还在,说明它不听话,那就上硬的。

 强制终止(慎用!)

# 发送 SIGKILL 信号,强制杀死进程kill -9 1234

警告:kill -9 不会给进程任何清理的机会,可能导致数据丢失或文件损坏。只在进程完全无响应时使用。

 批量杀进程(同类型进程一起处理)

# 杀死所有名为 php-fpm 的进程pkill php-fpm# 或者用 killallkillall php-fpm# 更狠的:杀死所有 php 相关进程pkill -9 php

进阶技巧:深入分析进程行为

 查看进程打开了哪些文件

有时候进程卡住是因为文件锁或者 IO 问题:

# 查看进程 1234 打开的所有文件lsof -p 1234# 查看某个文件被哪些进程占用lsof /var/log/nginx/error.log

 查看进程的系统调用

如果进程卡住但不知道在干嘛,可以跟踪它的系统调用:

# 跟踪进程 1234 的系统调用strace -p 1234# 只统计调用次数,不输出详细内容strace -c -p 1234

老哥实战案例: 有一次服务器卡死,用 strace 发现某个 PHP 进程一直在尝试连接一个已经下线的数据库,导致大量超时等待。修复数据库配置后问题解决。

 查看进程的线程详情

有些进程(比如 Java)会启动大量线程:

# 查看进程 1234 的所有线程top -H -p 1234# 或者用 ps 查看线程ps -eLf | grep 1234

预防胜于治疗:让进程管理自动化

 设置进程资源限制

防止某个进程吃光所有资源,可以用 ulimit:

# 编辑 limits.confvim /etc/security/limits.conf# 添加以下内容(限制 www-data 用户的进程)www-data  soft  nofile  65535www-data  hard  nofile  65535www-data  soft  nproc   4096www-data  hard  nproc   4096

 用 systemd 管理服务的资源限制

如果是 systemd 管理的服务,可以直接在 service 文件里限制:

# 编辑 nginx 服务配置systemctl edit nginx# 添加以下内容[Service]CPUQuota=80%MemoryLimit=2G

 写个监控脚本自动报警

#!/bin/bash# 保存为 /usr/local/bin/check-process.shTHRESHOLD=80  # CPU 阈值# 获取 CPU 使用率最高的进程TOP_PROC=$(ps aux --sort=-%cpu | head -n 2 | tail -n 1)PID=$(echo$TOP_PROC | awk '{print $2}')CPU=$(echo$TOP_PROC | awk '{print $3}')CMD=$(echo$TOP_PROC | awk '{print $11}')# 如果超过阈值,记录日志if (( $(echo "$CPU > $THRESHOLD" | bc -l) )); thenecho"$(date): 警告!进程 $CMD (PID: $PID) CPU 使用率 ${CPU}% 超过阈值" >> /var/log/process-alert.logfi

然后加到 crontab 里,每 5 分钟检查一次:

*/5 * * * * /usr/local/bin/check-process.sh

老哥的私房命令清单

最后分享几个我常用的组合命令,复制就能用:

# 1. 一键查看最耗资源的 5 个进程ps aux --sort=-%cpu | head -n 6# 2. 查看僵尸进程(状态为 Z 的进程)ps aux | awk '$8 ~ /Z/ {print}'# 3. 杀死所有僵尸进程的父进程(谨慎使用!)ps aux | awk '$8 ~ /Z/ {print $2}' | xargs -I {} ps -o ppid= -p {} | xargs -I {} kill -9 {}# 4. 实时监控 CPU 最高的进程(每 2 秒刷新)watch -n 2 'ps aux --sort=-%cpu | head -n 6'# 5. 查看进程的完整启动命令cat /proc/1234/cmdline | tr'\0'' '

总结

进程管理是运维的基本功,但很多人只会 kill -9。今天教的这些方法,从排查到分析到预防,形成了一套完整的流程。

记住三点:

  1. 先查清楚再动手,别盲目重启
  2. 优先用温柔的方式终止进程
  3. 做好监控和限制,预防比救火重要

服务器运维这条路,老哥我还在继续摸索。你有什么进程管理的独门秘籍?欢迎在评论区交流!


参考资料:

  • man ps
     / man top / man kill
  • Linux Performance Analysis: http://www.brendangregg.com/linuxperf.html

最新文章

随机文章