Linux 新手村Linux 新手村
🏠 首页
📖 教程
  • Linux 官网
  • Ubuntu 官网
  • CentOS 官网
🏠 首页
📖 教程
  • Linux 官网
  • Ubuntu 官网
  • CentOS 官网
  • 🚀 入门篇 - 欢迎来到 Linux 世界

    • 📚 长安的教程导航
    • 🐧 什么是 Linux?
    • 💿 安装 Linux
    • 🎉 首次开机
  • 🎯 基础篇 - 必备生存技能

    • ⌨️ 基础命令
    • 🗂️ 文件系统
    • 📝 文件操作
    • 👥 用户与权限
  • ⚔️ 进阶篇 - 成为高手之路

    • ⚔️ Vim 编辑器
    • 🤖 Shell 脚本
    • ⚙️ 进程与服务
    • 🌐 网络基础
  • 🏆 高级篇 - 突破自我

    • 💡 高级技巧
    • 🔧 故障排查
    • 🎭 日常案例与血泪教训

🔧 故障排查

大家好,我是长安!这一章是长安多年踩坑总结出来的故障排查经验,希望能帮你少走弯路。

🎯 本章目标

跟着长安读完这一章,你将学会:

  • 常见问题的诊断思路
  • 系统日志分析
  • 性能问题排查
  • 网络故障诊断

🧠 故障排查思路

遇到问题别慌!按这个思路来:

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  # 前台运行查看输出

常见服务问题

服务检查配置日志位置
Nginxnginx -t/var/log/nginx/
MySQLmysqld --verbose/var/log/mysql/
SSHsshd -t/var/log/auth.log

🔄 系统启动问题

查看启动日志

# 查看启动日志
dmesg
journalctl -b

# 查看上次启动日志
journalctl -b -1

进入单用户模式

如果系统无法正常启动:

  1. 重启时按住 Shift 进入 GRUB 菜单
  2. 选择 Advanced options
  3. 选择 Recovery mode
  4. 选择 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

🆘 紧急恢复

系统无响应

  1. 尝试切换到其他终端:Ctrl + Alt + F2
  2. 通过 SSH 远程连接
  3. 使用 Magic SysRq 键:
    • Alt + SysRq + R - 恢复键盘
    • Alt + SysRq + E - 发送 SIGTERM
    • Alt + SysRq + I - 发送 SIGKILL
    • Alt + SysRq + S - 同步磁盘
    • Alt + SysRq + U - 重新挂载只读
    • Alt + SysRq + B - 重启

误删文件恢复

# 如果还在使用中
# 找到进程
lsof | grep deleted

# 从 /proc 恢复
cp /proc/PID/fd/FD恢复的文件名

⚠️ 提醒

Linux 删除文件很难恢复! 重要文件一定要备份!

📝 本章小结

排查流程

查看日志 → 分析错误 → 搜索解决方案 → 尝试修复 → 验证结果

常用诊断命令

问题类型命令
系统日志journalctl, tail -f /var/log/syslog
CPUtop, htop, ps aux
内存free -h, ps aux --sort=-%mem
磁盘df -h, du -sh, iostat
网络ip addr, ping, ss -tlnp
服务systemctl status, journalctl -u

最后的忠告

💡 故障排查心得

  1. 保持冷静:慌乱会让问题更糟
  2. 看日志:90% 的问题日志里有答案
  3. 善用搜索:把错误信息复制到 Google
  4. 备份优先:修改配置前先备份
  5. 记录过程:下次遇到就不慌了

🚀 下一步

故障排查学完了,接下来跟着长安去看看 日常案例与血泪教训,那里有真实的使用场景和长安踩过的坑!

—— 编程指南社区 · 长安

最后更新: 2025/12/1 15:56
Prev
💡 高级技巧
Next
🎭 日常案例与血泪教训