常见问题排查
系统启动故障
启动过程分析
# 查看启动日志
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
exitsystemd服务故障
# 查看服务状态
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/CentOSinode耗尽
# 查看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 bitsudo权限问题
# 检查sudo配置
sudo -l # 列出当前用户sudo权限
visudo -c # 检查sudoers语法
# 常见问题修复
# 确保用户在wheel组或sudo组
groups username
usermod -aG wheel username # RHEL/CentOS
usermod -aG sudo username # Debian/UbuntuSELinux问题
# 查看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 ./programOOM(内存溢出)
# 查看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_性能优化