第 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——交互式增强版
htop 是 top 的现代化替代品,提供彩色界面、鼠标操作、树形视图和更直观的交互。
# 安装 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 降序排查
– 系统变慢时用 top 看 load average、wa(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 专家之路 | 敬请期待 |















暂无评论内容