🔧 故障排查
大家好,我是长安!这一章是长安多年踩坑总结出来的故障排查经验,希望能帮你少走弯路。
🎯 本章目标
跟着长安读完这一章,你将学会:
- 常见问题的诊断思路
- 系统日志分析
- 性能问题排查
- 网络故障诊断
🧠 故障排查思路
遇到问题别慌!按这个思路来:
1. 确认问题 → 具体是什么问题?
2. 收集信息 → 看日志、看状态
3. 分析原因 → 最近改了什么?
4. 尝试解决 → 一次只改一个地方
5. 验证结果 → 问题解决了吗?
6. 记录总结 → 下次遇到不再懵
📋 系统日志
日志文件位置
# 系统日志目录
ls /var/log/
# 常见日志文件
/var/log/syslog # 系统日志(Ubuntu)
/var/log/messages # 系统日志(CentOS)
/var/log/auth.log # 认证日志
/var/log/kern.log # 内核日志
/var/log/dmesg # 启动日志
/var/log/apt/ # APT 日志
/var/log/nginx/ # Nginx 日志(如果安装了)
查看日志
# 查看最新日志
tail -f /var/log/syslog
# 查看最后 100 行
tail -100 /var/log/syslog
# 搜索错误
grep -i error /var/log/syslog
grep -i fail /var/log/auth.log
# 查看今天的日志
journalctl --since today
# 查看某个服务的日志
journalctl -u nginx
journalctl -u ssh
# 实时查看
journalctl -f
journalctl 常用参数
# 查看启动日志
journalctl -b
# 查看上次启动的日志
journalctl -b -1
# 按时间筛选
journalctl --since "2024-01-01 00:00:00"
journalctl --since "1 hour ago"
journalctl --since yesterday
# 按优先级筛选
journalctl -p err # 只看错误
journalctl -p warning
💻 系统性能问题
CPU 占用过高
# 查看 CPU 使用情况
top
htop
# 找出占用 CPU 最高的进程
ps aux --sort=-%cpu | head -10
# 查看某个进程的详细信息
top -p PID
# 查看 CPU 信息
lscpu
cat /proc/cpuinfo
常见原因和解决方案:
| 原因 | 解决方案 |
|---|---|
| 某个进程失控 | kill PID 或 kill -9 PID |
| 程序死循环 | 检查代码或重启服务 |
| 病毒/挖矿程序 | 找到并删除可疑进程 |
| 负载过高 | 增加服务器或优化程序 |
内存不足
# 查看内存使用
free -h
# 查看占用内存最多的进程
ps aux --sort=-%mem | head -10
# 清理缓存(谨慎使用)
sync; echo 3 > /proc/sys/vm/drop_caches
常见原因和解决方案:
| 原因 | 解决方案 |
|---|---|
| 内存泄漏 | 重启有问题的服务 |
| 进程太多 | 关闭不需要的服务 |
| 物理内存不足 | 增加内存或添加 swap |
磁盘空间不足
# 查看磁盘使用情况
df -h
# 查找大文件
du -sh /* 2>/dev/null | sort -hr | head -20
du -sh /var/log/*
# 查找大于 100MB 的文件
find / -type f -size +100M 2>/dev/null
# 清理 apt 缓存
sudo apt clean
sudo apt autoclean
sudo apt autoremove
# 清理日志(保留最近的)
sudo journalctl --vacuum-time=7d
sudo journalctl --vacuum-size=100M
常见大文件位置:
/var/log/ # 日志文件
/var/cache/ # 缓存文件
/tmp/ # 临时文件
/home/*/ # 用户文件
磁盘 I/O 问题
# 查看磁盘 I/O
iostat -x 1
# 查看哪个进程在读写磁盘
iotop
# 查看打开的文件
lsof
🌐 网络故障排查
网络不通排查步骤
# 1. 检查网卡状态
ip addr
ip link
# 2. 检查是否有 IP
ip addr show eth0
# 3. 检查网关
ip route
# 4. ping 网关
ping 192.168.1.1
# 5. ping 公网 IP
ping 8.8.8.8
# 6. ping 域名(测试 DNS)
ping google.com
# 7. 检查 DNS 配置
cat /etc/resolv.conf
网络问题对照表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 没有 IP 地址 | DHCP 失败/配置错误 | 检查网络配置 |
| ping 网关不通 | 网卡/网线/交换机问题 | 检查物理连接 |
| ping 公网不通 | 网关配置错误/防火墙 | 检查路由和防火墙 |
| ping 域名不通 | DNS 配置错误 | 检查 /etc/resolv.conf |
端口不通排查
# 检查服务是否在监听
ss -tlnp | grep 端口号
# 检查防火墙
sudo ufw status
sudo iptables -L
# 从外部测试端口
telnet IP 端口
nc -zv IP 端口
DNS 问题
# 测试 DNS 解析
nslookup google.com
dig google.com
# 临时使用其他 DNS
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
🔐 权限问题
Permission denied
# 检查文件权限
ls -la filename
# 检查目录权限
ls -la dirname/
# 修改权限
chmod 644 file
chmod 755 script.sh
# 修改所有者
sudo chown user:group file
无法执行脚本
# 添加执行权限
chmod +x script.sh
# 检查 shebang 行
head -1 script.sh
# 应该是 #!/bin/bash 或类似的
sudo 问题
# 用户不在 sudoers
sudo usermod -aG sudo username
# 或编辑 sudoers 文件
sudo visudo
🛠️ 服务故障
服务无法启动
# 查看服务状态
sudo systemctl status 服务名
# 查看详细错误
sudo journalctl -u 服务名 -n 50
# 检查配置文件语法
# 以 nginx 为例
sudo nginx -t
# 尝试手动启动看错误
sudo 服务名 -f # 前台运行查看输出
常见服务问题
| 服务 | 检查配置 | 日志位置 |
|---|---|---|
| Nginx | nginx -t | /var/log/nginx/ |
| MySQL | mysqld --verbose | /var/log/mysql/ |
| SSH | sshd -t | /var/log/auth.log |
🔄 系统启动问题
查看启动日志
# 查看启动日志
dmesg
journalctl -b
# 查看上次启动日志
journalctl -b -1
进入单用户模式
如果系统无法正常启动:
- 重启时按住
Shift进入 GRUB 菜单 - 选择
Advanced options - 选择
Recovery mode - 选择
root进入单用户模式
修复文件系统
# 检查并修复文件系统(需要卸载)
fsck /dev/sda1
# 强制检查
fsck -f /dev/sda1
📝 常见问题速查
"command not found"
# 检查命令是否安装
which 命令
type 命令
# 检查 PATH
echo $PATH
# 安装缺失的命令
sudo apt install 包名
"No space left on device"
# 查看磁盘空间
df -h
# 清理空间
sudo apt clean
sudo journalctl --vacuum-size=100M
find /tmp -type f -atime +7 -delete
"Too many open files"
# 查看当前限制
ulimit -n
# 临时增加
ulimit -n 65535
# 永久修改
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf
"Connection refused"
# 服务没运行
sudo systemctl status 服务名
sudo systemctl start 服务名
# 检查端口
ss -tlnp | grep 端口号
"Host key verification failed" (SSH)
# 删除旧的 host key
ssh-keygen -R hostname
🆘 紧急恢复
系统无响应
- 尝试切换到其他终端:
Ctrl + Alt + F2 - 通过 SSH 远程连接
- 使用 Magic SysRq 键:
Alt + SysRq + R- 恢复键盘Alt + SysRq + E- 发送 SIGTERMAlt + SysRq + I- 发送 SIGKILLAlt + SysRq + S- 同步磁盘Alt + SysRq + U- 重新挂载只读Alt + SysRq + B- 重启
误删文件恢复
# 如果还在使用中
# 找到进程
lsof | grep deleted
# 从 /proc 恢复
cp /proc/PID/fd/FD恢复的文件名
⚠️ 提醒
Linux 删除文件很难恢复! 重要文件一定要备份!
📝 本章小结
排查流程
查看日志 → 分析错误 → 搜索解决方案 → 尝试修复 → 验证结果
常用诊断命令
| 问题类型 | 命令 |
|---|---|
| 系统日志 | journalctl, tail -f /var/log/syslog |
| CPU | top, htop, ps aux |
| 内存 | free -h, ps aux --sort=-%mem |
| 磁盘 | df -h, du -sh, iostat |
| 网络 | ip addr, ping, ss -tlnp |
| 服务 | systemctl status, journalctl -u |
最后的忠告
💡 故障排查心得
- 保持冷静:慌乱会让问题更糟
- 看日志:90% 的问题日志里有答案
- 善用搜索:把错误信息复制到 Google
- 备份优先:修改配置前先备份
- 记录过程:下次遇到就不慌了
🚀 下一步
故障排查学完了,接下来跟着长安去看看 日常案例与血泪教训,那里有真实的使用场景和长安踩过的坑!
—— 编程指南社区 · 长安
