常见问题排查

系统启动故障

启动过程分析

# 查看启动日志
dmesg | less
journalctl -b                        # 当前启动日志
journalctl -b -1                     # 上次启动日志
 
# 查看启动时间
systemd-analyze
systemd-analyze blame                # 各服务启动时间
systemd-analyze critical-chain       # 关键路径

GRUB故障修复

# 进入救援模式
# 在GRUB界面按e编辑,在linux行添加:
init=/bin/bash                       # 进入bash
systemd.unit=rescue.target           # 进入救援模式
 
# 修复GRUB
grub2-install /dev/sda
grub2-mkconfig -o /boot/grub2/grub.cfg
 
# 重置root密码
# 在GRUB编辑模式下添加:
rd.break
# 然后执行:
mount -o remount,rw /sysroot
chroot /sysroot
passwd root
touch /.autorelabel
exit
exit

systemd服务故障

# 查看服务状态
systemctl status service_name
systemctl is-failed service_name
 
# 查看服务日志
journalctl -u service_name -n 50
 
# 检查服务依赖
systemctl list-dependencies service_name
 
# 重置失败状态
systemctl reset-failed service_name

磁盘空间问题

磁盘空间不足

# 查看磁盘使用
df -h
df -i                                # 查看inode使用
 
# 查找大文件
find / -type f -size +100M 2>/dev/null | xargs ls -lh
 
# 查找大目录
du -h --max-depth=1 / | sort -hr | head -20
 
# 查找删除但仍占用空间的文件
lsof | grep deleted
 
# 清理日志文件
find /var/log -type f -name "*.log" -mtime +30 -delete
truncate -s 0 /var/log/large.log
 
# 清理包管理器缓存
apt clean                            # Debian/Ubuntu
yum clean all                        # RHEL/CentOS

inode耗尽

# 查看inode使用
df -i
 
# 查找大量小文件
find /path -type f | wc -l
 
# 查找目录下文件数量
for dir in /*; do echo $dir $(find $dir -type f | wc -l); done
 
# 删除大量文件
find /path -name "*.log" -type f -delete

网络故障排查

网络连接问题

# 检查网络接口
ip addr
ip link
 
# 检查路由
ip route
route -n
 
# 测试连通性
ping -c 4 8.8.8.8
ping -c 4 google.com                 # DNS测试
 
# 检查DNS
dig google.com
nslookup google.com
cat /etc/resolv.conf
 
# 检查防火墙
iptables -L -n
firewall-cmd --list-all
ufw status

端口占用问题

# 查看端口占用
ss -tunlp | grep :80
netstat -tunlp | grep :80
lsof -i :80
 
# 查看连接状态
ss -tan | awk '{print $1}' | sort | uniq -c
 
# 杀死占用端口的进程
kill -9 $(lsof -t -i:80)

SSH连接问题

# 检查SSH服务
systemctl status sshd
netstat -tunlp | grep 22
 
# 测试SSH连接(详细输出)
ssh -vvv user@host
 
# 检查SSH配置
sshd -t                              # 配置语法检查
 
# 检查SELinux(RHEL/CentOS)
getenforce
semanage port -l | grep ssh
 
# 检查hosts.deny
cat /etc/hosts.deny

权限问题

文件权限问题

# 查看权限
ls -la file
stat file
 
# 修改权限
chmod 755 file
chmod -R 755 directory/
 
# 修改所有者
chown user:group file
chown -R user:group directory/
 
# 特殊权限
chmod u+s file                       # SUID
chmod g+s directory                  # SGID
chmod o+t directory                  # Sticky bit

sudo权限问题

# 检查sudo配置
sudo -l                              # 列出当前用户sudo权限
visudo -c                            # 检查sudoers语法
 
# 常见问题修复
# 确保用户在wheel组或sudo组
groups username
usermod -aG wheel username           # RHEL/CentOS
usermod -aG sudo username            # Debian/Ubuntu

SELinux问题

# 查看SELinux状态
getenforce
sestatus
 
# 临时设置模式
setenforce 0                         # Permissive模式
setenforce 1                         # Enforcing模式
 
# 查看SELinux上下文
ls -Z file
ps -Z -p PID
 
# 修复文件上下文
restorecon -Rv /path
 
# 查看SELinux日志
ausearch -m AVC -ts recent
sealert -a /var/log/audit/audit.log

进程问题

进程卡死

# 查看进程状态
ps aux | grep process_name
cat /proc/PID/status
 
# 查看进程线程
ps -eLf | grep PID
pstack PID
 
# 查看进程打开的文件
lsof -p PID
 
# 查看进程系统调用
strace -p PID
 
# 查看进程堆栈
cat /proc/PID/stack
 
# 终止进程
kill PID
kill -9 PID                          # 强制终止
killall process_name

僵尸进程

# 查找僵尸进程
ps aux | grep -w Z
ps -eo pid,ppid,stat,cmd | grep Z
 
# 找到父进程
ps -o pid,ppid,stat,cmd -p PID
 
# 解决方法:重启父进程或杀死父进程
kill -CHLD PPID                     # 通知父进程

高CPU进程

# 查找高CPU进程
top -P
ps aux --sort=-%cpu | head -10
 
# 查看进程线程CPU使用
top -H -p PID
 
# 分析进程CPU使用
perf top -p PID
perf record -g -p PID -- sleep 10
perf report

内存问题

内存泄漏

# 查看进程内存使用
ps aux --sort=-%mem | head -10
pmap -x PID
 
# 监控内存变化
while true; do ps -o pid,rss,command -p PID; sleep 1; done
 
# 使用valgrind检测
valgrind --leak-check=full ./program

OOM(内存溢出)

# 查看OOM日志
dmesg | grep -i "out of memory"
journalctl -k | grep -i "oom"
 
# 查看OOM评分
cat /proc/PID/oom_score
cat /proc/PID/oom_score_adj
 
# 调整OOM策略
echo -500 > /proc/PID/oom_score_adj  # 降低被杀死概率
echo 1000 > /proc/PID/oom_score_adj  # 增加被杀死概率
 
# 禁用OOM
echo -17 > /proc/PID/oom_score_adj

服务故障排查

Web服务故障

# 检查服务状态
systemctl status nginx
systemctl status apache2
 
# 检查端口
ss -tunlp | grep :80
ss -tunlp | grep :443
 
# 检查配置语法
nginx -t
apachectl configtest
 
# 查看错误日志
tail -f /var/log/nginx/error.log
tail -f /var/log/apache2/error.log
 
# 检查SELinux
getsebool -a | grep httpd
ls -Z /var/www/html/

数据库服务故障

# 检查MySQL/MariaDB
systemctl status mysql
systemctl status mariadb
 
# 查看错误日志
tail -f /var/log/mysql/error.log
 
# 检查连接
mysqladmin -u root -p status
mysqladmin -u root -p processlist
 
# 检查磁盘空间
df -h /var/lib/mysql
 
# 检查权限
ls -la /var/lib/mysql/

日志分析技巧

# 实时查看日志
tail -f /var/log/syslog
 
# 搜索关键词
grep -i error /var/log/syslog
grep -A 5 -B 5 "error" /var/log/syslog
 
# 按时间范围查看
journalctl --since "2026-04-20 10:00:00" --until "2026-04-20 12:00:00"
awk '/2026-04-20 10:00/,/2026-04-20 12:00/' /var/log/syslog
 
# 统计日志
grep -c "error" /var/log/nginx/error.log
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10
 
# 多文件搜索
grep -r "pattern" /var/log/

💡 排查建议:

  • 先收集信息,后分析问题
  • 从简单到复杂,逐步排除
  • 查看日志是关键
  • 记录问题和解决方案
  • 建立排查checklist

🔗 相关笔记: 02.03_系统管理 02.04_网络管理 11.01_性能优化