运维救援:日志分析与硬核排障
当系统表现异常(如进程高负载、开机卡死、文件无法删除)时,你的第一反应应该是查阅日志。本章节将教你如何使用专业的排障工具集。
1. 统一日志中心:journalctl
Systemd 所有的日志都由 journald 统一管理。
| 场景 | 命令 | 说明 |
|---|---|---|
| 实时滚动 | journalctl -f | 类似 tail -f |
| 特定服务 | journalctl -u nginx | 只看 Nginx 的日志 |
| 报错过滤 | journalctl -p err -b | 只看本次启动的错误级别日志 |
| 时间范围 | journalctl --since "1 hour ago" | 查看过去一小时内的日志 |
| 清理空间 | sudo journalctl --vacuum-time=7d | 清理超过 7 天的旧日志 |
2. 内核的声音:dmesg
dmesg 输出的是内核环形缓冲区的信息。内存报错 (OOM)、硬盘坏道 (I/O error)、显卡驱动崩溃 都会记录在这里。
# 查看最后 20 行内核消息,并以人类易读的时间格式显示
sudo dmesg -T | tail -n 203. 硬核诊断工具:侦探的手法
当日志没有报错,但进程表现异常(如 CPU 100% 但不处理任务)时,你需要深入“进程内部”。
3.1 追踪系统调用:strace
strace 可以让你看到一个进程此刻正在与内核聊什么(打开了什么文件、发起了什么网络连接)。
# 跟踪 PID 为 1234 的进程正在进行的系统调用
sudo strace -p 1234
# 统计该进程最耗时的系统调用是哪个
sudo strace -cp 12343.2 查找文件占用:lsof
“文件已删除但空间没释放?”可能是某个进程还没关掉文件句柄。
# 谁在占用 /var/log/syslog?
sudo lsof /var/log/syslog
# 谁在监听 80 端口?
sudo lsof -i :804. 实战:开机卡死 (Boot Failure) 定位
如果你的 Linux 开机卡在黑屏或进度条,请按以下步骤自救:
视图分类:
救援模式 (Recovery)
- 在 Grub 菜单选择 Advanced options。
- 选择带有 (recovery mode) 的内核进入。
- 进入 root 终端进行修复。
chroot 模式 (救生舱)
如果系统彻底无法进入,使用 Live USB 启动:
- 挂载原硬盘根目录:
mount /dev/sda1 /mnt - 进入环境:
arch-chroot /mnt(或手动挂载 /sys, /proc 后 chroot) - 重新安装引导或修复配置。
5. 结业练习
任务 1 日志排障
故意写错 Nginx 或 SSH 的配置文件,重启服务。使用 systemctl status 和 journalctl -xe 准确定位出错的行号。
练习 2 strace 实操
运行 strace ls,观察仅仅是一个简单的 ls 命令,背后竟然发起了成百上千次系统调用。
练习 3 句柄排查
了解什么是 僵尸进程 (Zombie)?它们是否占用内存?为什么 kill -9 杀不掉它们?
Tip
排障不是靠运气,而是靠证据。永远先看 journalctl 和 dmesg,然后再用 strace 和 lsof 深入调查。