Ubuntu 系统系列 | 第 11 天:进程管理与监控——ps、top、htop、systemd-journald、日志分析

第 11/30 天

进程是 Linux 系统中一切活动的载体。每个运行的程序、每个后台服务、每个用户会话,本质上都是一个或多个进程。当系统变慢、CPU 飙升、内存耗尽或应用无响应时,第一件事就是查看进程状态——就像医生看病先量体温、测脉搏一样。

Ubuntu 提供了从简到繁的完整进程管理工具链:ps 用于静态快照、top 用于实时监控、htop 提供交互式体验、systemd-journald 则负责日志的集中管理和分析。今天,我们将系统学习这些工具,全面掌握进程管理与系统监控的核心技能。

二、实战步骤

2.1 ps——进程快照查

ps 是最基础的进程查看工具,用得好可以瞬间定位问题。

# 查看当前终端下的进程
ps

# 查看所有进程(BSD 风格)
ps aux

# 查看所有进程(标准语法)
ps -ef

# 自定义输出格式:只看 PID、PPID、CPU%、内存%、命令
ps -eo pid,ppid,%cpu,%mem,comm --sort=-%cpu | head -20

输出示例:

$ ps aux --sort=-%cpu | head -10
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      1023  5.2  0.8 167892 33456 ?        Ssl  09:15   8:32 /usr/bin/containerd
www-data  4567  2.1  1.2 452356 49120 ?        S    09:20   3:15 nginx: worker process
root      1567  1.8  0.3 189876 12345 ?        Ssl  09:13   2:48 /usr/sbin/sshd
mysql     2345  0.9  4.5 1.2G 184320 ?        Sl   09:14   1:32 /usr/sbin/mysqld

ps aux 字段含义

字段 含义
USER 启动进程的用户
PID 进程 ID
%CPU CPU 占用百分比
%MEM 内存占用百分比
VSZ 虚拟内存大小(KB)
RSS 常驻物理内存大小(KB)
STAT 进程状态码
START 启动时间
TIME 累计 CPU 时间
COMMAND 命令名

STAT 状态码详解

R     running 或 runnable(运行或可运行)
S     interruptible sleep(可中断睡眠,等待事件)
D     uninterruptible sleep(不可中断睡眠,通常为 I/O)
Z     zombie(僵尸进程,已终止但未被父进程回收)
T     stopped(被停止信号暂停)
<     高优先级(nice 值为负)
N     低优先级(nice 值为正)
s     进程组 leader
l     多线程(NPTL)

2.2 top——实时监控利器

top 是系统管理员最常用的实时监控工具,每 3 秒刷新一次系统概况和进程列表。

# 启动 top
top

# 以批处理模式输出 3 次(适合脚本采集)
top -b -n 3

# 按特定字段排序启动
top -o %CPU

# 只查看特定用户的进程
top -u www-data

运行 top 后的典型界面:

top - 10:30:45 up 12 days,  3:15,  2 users,  load average: 0.15, 0.30, 0.45
Tasks: 235 total,   1 running, 234 sleeping,   0 stopped,   0 zombie
%Cpu(s):  2.5 us,  0.8 sy,  0.0 ni, 96.5 id,  0.0 wa,  0.0 hi,  0.2 si,  0.0 st
MiB Mem :   7956.3 total,   2345.6 free,   3210.4 used,   2400.3 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   4210.5 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
 1567 root      20   0  189876  12345   5678 S   2.0   0.2   2:48.12 sshd
 2345 mysql     20   0   1.2G  184320  23456 S   1.5   2.3   1:32.45 mysqld
 1023 root      20   0  167892  33456   7890 S   0.8   0.4   8:32.15 containerd

top 界面解读

第 1 行:系统概况
10:30:45 — 当前时间
up 12 days — 系统已运行时间
2 users — 登录用户数
load average: 0.15, 0.30, 0.45 — 1 分钟、5 分钟、15 分钟平均负载

🔍 负载解读:负载值 ≤ CPU 核心数 = 正常;负载值 > CPU 核心数 × 0.7 = 需要关注;负载值 >> CPU 核心数 = 系统过载

第 2 行:进程统计
total — 总进程数
running — 正在运行的进程数
sleeping — 睡眠中的进程数

第 3 行:CPU 使用率
us — 用户空间占用
sy — 内核空间占用
ni — 调整过 nice 值的进程占用
id — 空闲率(最重要的指标)
wa — 等待 I/O 完成的时间
hi — 硬件中断
si — 软件中断
st — 被虚拟机偷走的时间

top 交互快捷键(在 top 界面中按):

按键 功能
1 切换显示每个 CPU 核心的负载
P 按 CPU 使用率排序
M 按内存使用率排序
k 杀死进程(输入 PID 和信号)
r 调整进程的 nice 值
u 只显示某用户的进程
c 切换显示完整命令行
q 退出 top

2.3 htop——交互式增强版

htoptop 的现代化替代品,提供彩色界面、鼠标操作、树形视图和更直观的交互。

# 安装 htop(Ubuntu 默认未安装)
sudo apt install htop -y

# 启动 htop
htop

# 以树形视图启动
htop --tree

# 仅显示特定用户的进程
htop -u www-data

htop 的优势:

# 与 top 的关键区别
# 1. 彩色显示:CPU 类型、内存使用、负载分区一目了然
# 2. 鼠标操作:点击列标题排序,点击进程操作
# 3. 垂直和水平滚动:看到所有进程和所有列
# 4. 树形视图:可以直观看到进程的父子关系

# 使用示例:找出所有 nginx 子进程
htop -p $(pgrep -d',' nginx)

htop 常用快捷键

按键 功能
F2 设置(显示列、颜色、排序)
F3 搜索进程
F4 过滤进程(按名称)
F5 树形视图切换
F6 选择排序字段
F9 杀死进程
F10 退出

2.4 进程管理与信号控制

Linux 通过信号(Signal)机制控制进程行为。kill 命令本质是发送信号,而非直接”杀死”。

# 查看所有可用信号
kill -l

# 常用信号:
# 1  (SIGHUP)    - 挂起/重载配置
# 2  (SIGINT)    - 中断(Ctrl+C)
# 9  (SIGKILL)   - 强制杀死(不可忽略)
# 15 (SIGTERM)   - 终止(默认信号,优雅关闭)
# 19 (SIGSTOP)   - 暂停(不可忽略)
# 18 (SIGCONT)   - 恢复运行

实战场景

# 场景 1:优雅重启 nginx
kill -HUP $(cat /var/run/nginx.pid)

# 场景 2:用进程名终止
killall nginx
pkill -f "python app.py"

# 场景 3:强制杀死僵尸进程的父进程
# 首先找到僵尸进程
ps aux | grep -w Z
# 然后杀死其父进程(PPID)
kill -9 <PPID>

# 场景 4:调整运行中进程的优先级
# 用 nice 启动(低优先级)
nice -n 10 ./long-running-task.sh

# 用 renice 调整已运行的进程
renice -n 5 -p 1234

2.5 systemd-journald——日志集中管理

systemd-journald 是 systemd 的日志守护进程,收集内核日志、服务日志、用户登录记录等所有系统日志。

# 查看系统日志(默认显示所有日志,使用 less 分页)
journalctl

# 查看本次启动以来的日志
journalctl -b

# 查看上一次启动的日志(排查重启前的问题)
journalctl -b -1

# 实时追踪日志(类似 tail -f)
journalctl -f

# 查看特定服务的日志
journalctl -u nginx.service
journalctl -u ssh.service

# 查看内核日志
journalctl -k

# 按时间范围过滤
journalctl --since "2026-07-20 09:00:00" --until "2026-07-20 18:00:00"

# 最近 30 分钟内的日志
journalctl --since "30 min ago"

输出示例:

$ journalctl -u nginx.service --since "10 min ago"
Jul 21 10:25:00 ubuntu-server nginx[1567]: 2026/07/21 10:25:00 [error] 4567#4567: *123 open()
  "/var/www/html/index.html" failed (2: No such file or directory), client: 192.168.1.50
Jul 21 10:28:15 ubuntu-server systemd[1]: Reloading nginx.service
Jul 21 10:28:15 ubuntu-server nginx[1567]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
Jul 21 10:28:15 ubuntu-server nginx[1567]: nginx: configuration file /etc/nginx/nginx.conf test is successful
Jul 21 10:28:15 ubuntu-server systemd[1]: Reloaded nginx.service.

journalctl 高级用法

# 查看特定 PID 的日志
journalctl _PID=1234

# 查看特定用户的日志
journalctl _UID=1000

# 按优先级过滤(0=emerg, 1=alert, 2=crit, 3=err, 4=warning, 5=notice, 6=info, 7=debug)
# 只显示错误及以上级别
journalctl -p err -b

# 显示最近 5 条日志
journalctl -n 5

# JSON 格式输出(便于脚本处理)
journalctl -u nginx.service -o json-pretty

# 查看日志占用的磁盘空间
journalctl --disk-usage

日志持久化与维护

# 查看日志配置
cat /etc/systemd/journald.conf

# 设置日志最大占用 500MB
# 编辑 /etc/systemd/journald.conf
# SystemMaxUse=500M

# 手动清理日志(保留最近 2 天)
sudo journalctl --vacuum-time=2d

# 限制日志文件最大 200MB
sudo journalctl --vacuum-size=200M

# 重启 journald 使配置生效
sudo systemctl restart systemd-journald

三、常见问题

Q1:僵尸进程怎么处理?

现象ps aux 看到状态为 Z 的进程,且无法用 kill -9 杀死。

原因:子进程已终止,但父进程未调用 wait() 回收其 PCB。

解决:杀死僵尸进程的父进程(PPID),让 init(PID 1)接管并回收:

# 找到僵尸进程及其父进程
ps -eo pid,ppid,stat,cmd | grep -w Z
# 杀死父进程(注意父进程可能是关键服务)
kill -15 <PPID>

Q2:CPU 负载高但 CPU 空闲率也高?

现象load average 很高(如 8.0),但 top 显示 %id 很高(如 90%+)。

原因:大量进程在等待 I/O(磁盘、网络),wa 列会升高。常见于磁盘性能瓶颈。

排查

# 查看 I/O 等待
top -n 1 | grep -E "wa|Cpu"

# 使用 iostat 确认磁盘问题
iostat -x 1 3

Q3:journalctl 日志文件太大怎么办?

问题:日志文件占用大量磁盘空间,尤其是 debug 输出多的服务。

解决:限制日志大小并清理:

# 立即清理(保留最近 500MB 日志)
sudo journalctl --vacuum-size=500M

# 持久配置
sudo sed -i 's/^#SystemMaxUse=/SystemMaxUse=/; s/^SystemMaxUse=.*/SystemMaxUse=500M/' /etc/systemd/journald.conf
sudo systemctl restart systemd-journald

Q4:top 和 htop 显示的 CPU 不一致?

原因:默认情况下,top 显示的是所有 CPU 的平均值,而 htop 默认显示每个 CPU 核心的独立负载。在 top 中按 1 键即可看到每个核心的负载,两者数据是一致的。


四、总结

今天我们学习了 Ubuntu 进程管理与监控的完整工具链:

工具 用途 关键命令
ps 进程快照查看 ps aux, ps -ef, ps -eo pid,%cpu,comm
top 实时系统监控 top, top -o %CPU, top -b -n 3
htop 交互式进程管理 htop, htop --tree
kill/pkill 进程信号控制 kill -15, kill -9, pkill
journalctl 日志集中管理 journalctl -u nginx, journalctl -b, journalctl -f

核心要点
– 看到异常进程先用 ps aux --sort=-%cpu 按 CPU 降序排查
– 系统变慢时用 topload averagewa(I/O 等待)和 id(空闲率)
– 日志是排查问题的第一手资料,养成先查 journalctl -u <service> 的习惯
– 杀死进程时优先使用 SIGTERM(15),确认无效再使用 SIGKILL(9)

进程管理是系统管理员每天的必修课。掌握这些工具,你就能在系统出问题时快速定位、精准操作,而不是”重启解决一切”。


下期预告

第 12 天:日志管理与审计——rsyslog、logrotate、auditd、集中日志收集

日志是系统运行的历史记录,也是安全审计的原始证据。明天,我们将深入 Ubuntu 的日志管理体系,学习如何用 rsyslog 配置日志转发、用 logrotate 自动轮转日志、用 auditd 实现安全审计,以及如何搭建集中日志收集方案。你将拥有系统全生命周期的”监控摄像头”。


Ubuntu 系统系列目录

天数 主题 链接
第 1 天 Ubuntu 简介与版本选择 阅读
第 2 天 手把手安装 Ubuntu 阅读
第 3 天 Ubuntu 桌面环境初探 阅读
第 4 天 Ubuntu 终端基础 阅读
第 5 天 用户与权限管理 阅读
第 6 天 软件包管理 阅读
第 7 天 文件与文本操作 阅读
第 8 天 系统服务管理 阅读
第 9 天 磁盘与文件系统管理 阅读
第 10 天 网络配置与管理 阅读
第 11 天 进程管理与监控 ← 今日发布
第 12 天 日志管理与审计 敬请期待
第 13 天 计划任务与自动化 敬请期待
第 14 天 Shell 脚本编程基础 敬请期待
第 15 天 系统备份与恢复 敬请期待
第 16 天 远程访问与 SSH 配置 敬请期待
第 17 天 Web 服务器搭建(Nginx/Apache) 敬请期待
第 18 天 数据库安装与配置(MySQL/PostgreSQL) 敬请期待
第 19 天 DNS 与域名解析 敬请期待
第 20 天 安全加固与入侵检测 敬请期待
第 21 天 性能监控与调优 敬请期待
第 22 天 容器技术入门(Docker) 敬请期待
第 23 天 容器编排入门(Docker Compose) 敬请期待
第 24 天 虚拟化技术(KVM/QEMU) 敬请期待
第 25 天 存储管理进阶(NFS/iSCSI) 敬请期待
第 26 天 高可用与负载均衡 敬请期待
第 27 天 自动化运维(Ansible 入门) 敬请期待
第 28 天 系统升级与迁移 敬请期待
第 29 天 故障排查实战 敬请期待
第 30 天 Ubuntu 专家之路 敬请期待
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容