【运维】Linux 服务器实战(7):软件报错与系统诊断手册
Linux 服务器实战 · 第 7 篇
软件报错、服务起不来——按 日志链路 + 6 步检查单 排查。
1. 日志从哪里看
应用自己的 log 文件
↓
journalctl -u 服务名
↓
/var/log/syslog
↓
dmesg(内核/OOM/磁盘)
```bash
sudo tail -f /var/log/nginx/error.log
sudo journalctl -u myapp -f
sudo tail -f /var/log/syslog
dmesg -T | tail -30
文件查看技巧:
```bash
tail -n 100 -f app.log
less +F app.log # Ctrl+C 暂停,F 继续跟踪
grep -C 3 "ERROR" app.log
grep -E "error|fail|exception" -i app.log | tail -20
---
## 2. 服务起不来:6 步检查单
| 步 | 命令 | 查什么 |
|----|------|--------|
| 1 | `systemctl status SVC` | 退出码、最后几行日志 |
| 2 | `journalctl -u SVC -n 80 --no-pager` | 完整错误栈 |
| 3 | `ss -tlnp \| grep PORT` | 端口是否被占 |
| 4 | 手动前台启动 | 配置/权限/依赖报错更直观 |
| 5 | `df -h` / `free -h` | 磁盘满 / 内存尽 |
| 6 | `namei -l /path/to/binary` | 路径上每一级权限 |
前台试跑示例:
```bash
cd /var/www/myapp
sudo -u deploy ./venv/bin/gunicorn -b 127.0.0.1:8000 wsgi:application
---
## 3. 动态库 / 依赖缺失
```bash
ldd ./your_binary | grep "not found"
objdump -p ./your_binary | grep NEEDED
缺包时:
```bash
sudo apt install -y libxxx
sudo ldconfig
---
## 4. 网络类错误
```bash
curl -v http://127.0.0.1:8000/
curl -vI https://api.example.com
dig +trace example.com
sudo ufw status
---
## 5. 磁盘满 / inode 满
```bash
df -h
df -i
sudo du -sh /var/* | sort -rh | head
sudo lsof +L1 | head # 已删除但仍被进程占用的文件
---
## 6. 文件句柄过多
```bash
ulimit -n
cat /proc/PID/limits
ls /proc/PID/fd | wc -l
系统级调高 `/etc/security/limits.conf`(需评估)。
---
## 7. 跟踪进程在干什么
```bash
sudo strace -p PID -f -e trace=file,network 2>&1 | head -50
sudo lsof -p PID -r 5
生产环境 strace 有开销,短时间采样即可。
---
## 8. 批量改配置(先预览)
```bash
find /etc/nginx -name '*.conf' -print
find /etc/nginx -name '*.conf' -exec grep -l 'old_value' {} +
# 确认后:
find /etc/nginx -name '*.conf' -exec sed -i 's/old_value/new_value/g' {} +
sudo nginx -t && sudo systemctl reload nginx
---
## 本篇速查
```bash
sudo systemctl status SVC --no-pager
sudo journalctl -u SVC -n 100 --no-pager
df -h && df -i && free -h
ldd ./binary | grep not
```
系列导航
| 篇 | 主题 |
|---|---|
| 1–6 | 见前篇 |
| 7 | 故障诊断(本文) |
| 8 | 部署、备份、Cron(收官) |