1.5.2 服务管理命令与状态排查

服务管理命令是运维排障的第一入口,核心围绕 systemctl 与 journalctl 展开。本节给出服务状态流转原理、常用命令、排错流程、示例与练习,确保可复现与可落地。

文章图片

关键命令速查与解释#

  • service 启停与状态
  • systemctl start|stop|restart|reload <service>:启动/停止/重启/平滑重载
  • systemctl status <service>:查看状态、PID、退出码、启动日志片段
  • systemctl is-active <service>:返回 running/failed/inactive
  • 自启动与单元文件
  • systemctl is-enabled <service>:检查是否开机启用
  • systemctl list-unit-files --type=service:查看所有服务启用状态
  • systemctl cat <service>:查看合并后的 unit 定义
  • 批量排查
  • systemctl --failed:列出失败单元
  • systemctl list-units --type=service --state=running:运行中服务
  • 日志排查
  • journalctl -u <service> -xe:最近错误日志
  • journalctl -u <service> -b:本次启动日志
  • journalctl -u <service> -S "2024-01-01 10:00" -U "2024-01-01 11:00":时间范围

示例:以 nginx 为例进行完整排查#

# 1) 查看状态
systemctl status nginx

# 2) 查看失败日志(如果失败)
journalctl -u nginx -xe

# 3) 查看 unit 定义
systemctl cat nginx

# 4) 检查是否启用开机启动
systemctl is-enabled nginx

# 5) 查看端口监听
ss -lntp | grep ':80'

# 6) 若修改过 unit,刷新缓存并重启
systemctl daemon-reload
systemctl restart nginx

预期效果说明:
- status 输出中 Active: running 表示运行正常
- Main PID 存在且 ss 看到端口监听,说明服务与端口一致
- journalctl 出现配置语法错误或权限错误,按提示修复

常见故障与定位方法#

1) 配置语法错误

# 以 nginx 为例进行配置语法检查
nginx -t

# 预期:syntax is ok
# 若失败,修复 /etc/nginx/nginx.conf 或 include 文件

2) 端口被占用

# 找到占用端口的进程
ss -lntp | grep ':80'
lsof -i:80

# 处理:停止占用端口进程或修改服务端口

3) 依赖服务未就绪

# 查看依赖关系
systemctl list-dependencies nginx

# 查看依赖服务状态
systemctl status network.target
systemctl status systemd-resolved

4) 权限不足

# 检查服务运行用户与目录权限
systemctl cat nginx | grep -E 'User=|Group=|WorkingDirectory='
ls -ld /var/lib/nginx /var/log/nginx /etc/nginx

# 修复权限
chown -R nginx:nginx /var/lib/nginx /var/log/nginx

5) 启动超时

# 查看默认超时
systemctl show nginx | grep TimeoutStartUSec

# 临时调整超时(新建 override)
systemctl edit nginx
# /etc/systemd/system/nginx.service.d/override.conf
[Service]
TimeoutStartSec=120
systemctl daemon-reload
systemctl restart nginx

排错流程建议(可打印执行)#

  1. 核对 unit 与配置:systemctl cat,服务自带 -t 语法检查
  2. 查看状态与退出码:systemctl status
  3. 查看日志:journalctl -u <service> -xe -b
  4. 核对依赖与端口:systemctl list-dependenciesss -lntp
  5. 核对权限与资源:ls -lulimit -n
  6. 修复后:daemon-reload + restart

练习#

1) 将一个不存在的服务名传给 systemctl status,观察返回码并解释含义。
2) 手动停止 nginx 后,验证 is-activestatus 输出差异。
3) 修改 nginx 配置为错误语法,尝试启动并用 journalctl -u nginx -xe 找出报错行。
4) 使用 ss -lntplsof -i:80 对比端口占用信息。
5) 为 nginx 新建 override 文件修改 TimeoutStartSec,重启并验证生效:

systemctl show nginx | grep TimeoutStartUSec