4.3.1 进程状态与基础命令(ps、top、htop)

进程状态与基础命令(ps、top、htop)#

核心概念与状态理解#

进程状态常见包括运行(R)、可中断睡眠(S)、不可中断睡眠(D)、停止(T)、僵尸(Z)。运维关注重点:
- D 状态:通常与 I/O 阻塞相关,可能指向磁盘/网络瓶颈或驱动问题。
- Z 状态:父进程未及时回收子进程资源,需检查父子进程关系与回收逻辑。
- 高负载不等于高 CPU:需区分 CPU 等待与 I/O 等待。

进程状态与监控工具关系示意:

文章图片

安装与环境准备#

不同发行版安装 htop(ps/top 通常默认已安装):

# CentOS/RHEL
sudo yum install -y htop

# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y htop

# 验证
htop --version

ps:静态快照与筛选(含命令解释与示例)#

常用字段解释
- PID/PPID:进程与父进程 ID
- STAT:状态(R/S/D/T/Z)及附加标志(+ 前台,< 高优先级)
- VSZ:虚拟内存(KB)
- RSS:常驻内存(KB)

示例:查看全量进程与关键字段

ps -ef
# UID   PID  PPID  C STIME TTY      TIME CMD
# root    1     0  0 10:01 ?        00:00:05 /sbin/init

示例:按 CPU 使用率排序,取前 5 个

ps -eo pid,ppid,stat,%cpu,%mem,vsz,rss,cmd --sort=-%cpu | head -n 5
# 1234  1001 R+  98.5  1.2 123456  7890 /usr/bin/java ...

示例:按进程名筛选并查看状态

ps -C nginx -o pid,ppid,stat,cmd
# 2100  1  S  nginx: master process /usr/sbin/nginx
# 2101 2100 S  nginx: worker process

场景说明
- 若 STAT 为 D,需关注 I/O 等待;
- 若 STAT 为 Z,应检查父进程是否回收子进程。


top:动态监控与交互分析(含命令解释与示例)#

启动与聚焦:

top
# 默认每 3 秒刷新一次,按 CPU 占用排序

top -p 1234
# 仅观察 PID=1234 的进程

top -H -p 1234
# 展示该进程的线程占用

交互快捷键说明:
- P:按 CPU 排序
- M:按内存排序
- 1:显示每核 CPU
- c:显示完整命令
- k:终止进程(输入 PID)
- r:调整优先级(nice)

指标解读:
- load average:需与 CPU 核数对比
- %wa:I/O 等待高说明磁盘/网络阻塞
- RES/SHR:实际常驻与共享内存


htop:友好化可视化与树形视图(含命令解释与示例)#

启动与常用功能:

htop
# 进入交互界面,可用鼠标操作

快捷键与操作:
- F3 搜索进程
- F4 过滤
- F5 树形展示
- F6 排序字段选择
- F9 杀进程

树形模式排查示例
1. F5 切换树形
2. 找到父进程与子进程关系
3. 观察是否有孤儿进程或僵尸进程


典型排查流程(含可执行示例)#

场景:服务器负载高但 CPU 不高

# 1. top 观察 load 与 %wa
top

# 2. 定位 D 状态进程
ps -eo pid,ppid,stat,cmd | awk '$3 ~ /^D/'

# 3. 检查对应进程的打开文件/网络(结合后续章节工具)
# 例如 lsof -p <pid> / ss -p

场景:发现 Z 状态进程

# 1. 找出僵尸进程
ps -eo pid,ppid,stat,cmd | awk '$3 ~ /^Z/'

# 2. 查看父进程
ps -o pid,ppid,cmd -p <PPID>

# 3. 如父进程异常,可考虑重启父进程或服务

常见错误与排错建议#

  1. ps 输出为空:确认进程名是否正确,建议用 ps -ef | grep 验证。
  2. top 无法显示全部命令:按 c 显示完整 CMD。
  3. htop 无法启动:确认已安装与权限(which htopsudo htop)。
  4. %CPU 很高但业务无响应:查看线程级别 top -H -p <pid>,并结合应用日志定位热点线程。

练习与实操#

  1. 查找最高内存进程并解释字段
    bash ps -eo pid,ppid,stat,%mem,vsz,rss,cmd --sort=-%mem | head -n 3

  2. 模拟高 CPU 进程并定位
    bash # 生成 CPU 压力(仅测试环境) yes > /dev/null & ps -eo pid,ppid,stat,%cpu,cmd --sort=-%cpu | head -n 3 kill %1

  3. 查看某服务的父子进程关系
    bash ps -C nginx -o pid,ppid,stat,cmd


运维实践建议#

  • 养成使用 ps 定制字段输出的习惯,提升定位效率。
  • 线上环境优先用 top/htop 快速定位,再用 ps 做精确确认。
  • 建立关键服务的 CPU/内存基线,异常时快速比对。
  • 将进程状态与业务行为关联,避免仅凭系统指标下结论。