558 字
3 分钟
Linux 进程、systemd 服务与日志排查
服务不可用时,不要直接反复重启。先确认进程是否存在、端口是否监听、systemd 为什么判定失败,以及应用在退出前记录了什么。
查看进程
ps auxps -eo pid,ppid,user,stat,%cpu,%mem,etime,cmd --sort=-%cpu | headpgrep -af nginx常见进程状态:
R:正在运行或等待 CPU。S:可中断睡眠,通常在等待事件。D:不可中断睡眠,常见于磁盘或网络存储等待。Z:僵尸进程,子进程已退出但父进程未回收。
查看资源
topfree -hvmstat 1iostat -xz 1top 适合快速观察,vmstat 可以区分 CPU、内存和 I/O 压力。iostat 通常由 sysstat 软件包提供。
systemd 常用命令
systemctl status nginxsudo systemctl start nginxsudo systemctl stop nginxsudo systemctl restart nginxsudo systemctl reload nginxsudo systemctl enable nginxsystemctl is-enabled nginxsystemctl is-active nginx配置支持热加载时优先使用 reload,可以减少连接中断。修改单元文件后运行:
sudo systemctl daemon-reloadsudo systemctl restart myapp查看单元配置
systemctl cat myappsystemctl show myappsystemctl list-dependencies myapp不要直接修改软件包提供的 /usr/lib/systemd/system/*.service。使用覆盖配置:
sudo systemctl edit myapp例如设置环境变量和重启策略:
[Service]Environment="APP_ENV=production"Restart=on-failureRestartSec=5sjournalctl
journalctl -u myappjournalctl -u myapp -n 100 --no-pagerjournalctl -u myapp -fjournalctl -u myapp --since '2026-07-30 08:00'journalctl -p err..alert --since today查看本次启动:
journalctl -bjournalctl -u myapp -b查看上一次启动:
journalctl -b -1端口与连接
ss -lntupss -lntp 'sport = :8080'curl -v http://127.0.0.1:8080/health进程存在但服务不可访问时,确认它监听的是 127.0.0.1、0.0.0.0 还是 IPv6 地址,并检查防火墙、反向代理和容器端口映射。
信号与停止进程
kill -TERM PIDkill -HUP PIDkill -KILL PIDTERM 请求正常退出,HUP 常被服务用于重新加载配置,KILL 无法被捕获,会跳过清理逻辑。优先使用服务管理器停止服务:
sudo systemctl stop myapp标准排障顺序
systemctl status myapp查看摘要和退出码。journalctl -u myapp -n 200查看完整错误。systemctl cat myapp检查启动命令、用户和环境。- 以服务账户手动验证配置或启动命令。
- 使用
ss确认端口。 - 检查磁盘、内存、权限和依赖服务。
- 修复根因后再重启并观察日志。
参考资料
Linux 进程、systemd 服务与日志排查
https://zh19990906.github.io/fuwari/posts/linux-process-services-logs/