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
排错流程建议(可打印执行)#
- 核对 unit 与配置:
systemctl cat,服务自带-t语法检查 - 查看状态与退出码:
systemctl status - 查看日志:
journalctl -u <service> -xe -b - 核对依赖与端口:
systemctl list-dependencies、ss -lntp - 核对权限与资源:
ls -l、ulimit -n - 修复后:
daemon-reload+restart
练习#
1) 将一个不存在的服务名传给 systemctl status,观察返回码并解释含义。
2) 手动停止 nginx 后,验证 is-active 与 status 输出差异。
3) 修改 nginx 配置为错误语法,尝试启动并用 journalctl -u nginx -xe 找出报错行。
4) 使用 ss -lntp 与 lsof -i:80 对比端口占用信息。
5) 为 nginx 新建 override 文件修改 TimeoutStartSec,重启并验证生效:
systemctl show nginx | grep TimeoutStartUSec