Linux 系统 Bug 调试操作手册
适用环境:Ubuntu 20.04 / 22.04 / 24.04(systemd 体系)目标读者:有基础 Linux 经验的后端开发,目标是能独立定位中低复杂度问题覆盖问题:崩溃(Crash)、挂起(Hang)、OOM、性能劣化、服务启动失败工具原则:优先系统自带工具(procps / iproute2 / systemd / util-linux),少量常用诊断工具通过官方 apt 源安装,不依赖任何第三方商业软件
使用约定
- 每个命令后跟一行 「看什么」,说明输出里该盯住的关键字或数值。
- 命令中的
<svc> 指 systemd 服务名,<PID> 指进程号,按实际替换。 - 排查顺序永远是:先保现场 → 再看资源 → 后动进程。没采集信息就重启,等于销毁证据。
- 正文含 6 张 Mermaid 流程图(总决策树 + 五类问题专项流程)。GitHub / GitLab / Typora 原生渲染;VS Code 需装 Mermaid 预览插件。
1. 信息采集清单(到场后前 60 秒)
不管什么问题,
输出本身就是第一手证据,也能让后续排查少绕路。
| | | |
|---|
| uptime | | load average: |
| free -h | | available |
| df -h | | |
| df -i | | IUse% |
| vmstat 1 5 | | r |
| dmesg -T | tail -50 | | segfault、Out of memory、I/O error、EXT4-fs error |
| journalctl -p 3 -xb | tail -50 | | |
| systemctl --failed | | |
| ps aux --sort=-%mem | head -15 | | |
| ps aux --sort=-%cpu | head -15 | | |
| ss -lntp | | |
| ss -s | | timewait |
一次性快照(可直接粘贴执行):
uptime; free -h; df -h; df -i; ss -s; dmesg -T | tail -30
看什么:一眼扫过去是否已有明显异常——磁盘满、内存空、连接堆积、内核报错,任何一条命中就直接指向对应章节。
补充:如果机器装了 sysstat(见 §4),历史数据是"案发当时"的唯一证人:
sar -u -f /var/log/sysstat/sa(systemctl show <svc> -p EnvironmentFile --value)
看什么:环境文件是否存在、格式是否为 KEY=VALUE(不能带 export、不能有行内注释展开)。
端口占用:
看什么:端口被哪个进程占着——常见于旧进程没退干净,或两个服务配了同一端口。
以运行用户身份手动复现:
sudo -u <服务运行用户> <ExecStart原始命令>
看什么:报什么错。root 手动跑能起来、服务用户跑不起来 = 权限问题;这一步能复现 80% 的启动失败。
日志不足时追踪系统调用:
strace -f -e trace=openat,connect,bind -o /tmp/<svc>.trace <ExecStart 原始命令>
看什么:哪个文件打开失败(= -1 ENOENT 路径不存在 / EACCES 无权限)、哪个 connect/bind 失败。
判断依据:退出码定大方向,日志定具体行。90% 的启动失败归为五类——配置错误、端口冲突、权限不足、路径/文件缺失、依赖服务未就绪。改过 unit 文件后务必:
systemctl daemon-reload && systemctl restart <svc>
看什么:不先 daemon-reload,重启用的还是旧配置,会造成"改了没生效"的错觉。
4. 常用工具速查表
标注「自带」的为 Ubuntu 服务器默认安装;其余一条命令装齐:
sudo apt update && sudo apt install -y gdb strace lsof sysstat iotop tcpdumpsudo apt install -y linux-tools-common linux-tools-generic "linux-tools-(uname -r);虚拟机报权限错误时调低 kernel.perf_event_paranoid。Ubuntu 的 core dump 被 systemd-coredump 接管,用 coredumpctl 查,不要去进程目录里找 core 文件。区分两种退出:code=killed 是被信号杀(外部/OOM/段错误),code=exited 是进程自己退出(看 status 码)。磁盘"满"有两种:容量满(df -h)和 inode 满(df -i),后者更隐蔽。改了 unit 文件先 systemctl daemon-reload,否则重启加载的还是旧配置。