本手册针对测试环境中高频出现的服务启动失败、端口占用、自启失效等问题,提供 systemctl 环境优先的排查步骤和解决方案。
一、 服务启动失败(最常见问题)
故障现象
执行 systemctl start 服务名 后提示 failed,或 systemctl status 服务名 显示 active(failed)。
排查步骤
-
第一步:查看详细错误状态
bash
运行
systemctl status 服务名 -l # -l 参数显示完整日志信息重点关注
Active状态和Main PID后的报错描述(如permission denied、file not found)。 -
第二步:查看服务日志(核心手段)
bash
运行
journalctl -u 服务名 -f # -f 实时跟踪最新日志 journalctl -u 服务名 --since "10 minutes ago" # 查看最近10分钟日志日志中会明确标注失败原因(如配置文件语法错误、依赖服务未启动)。
-
第三步:针对性解决常见原因
报错原因 解决方案 测试场景示例 配置文件语法错误 检查配置文件格式,修复后重载配置 systemctl reload 服务名Nginx 配置缺少分号 → 编辑 /etc/nginx/nginx.conf修正权限不足 修改文件 / 目录权限 chown -R 服务用户:用户组 目标路径``chmod 755 可执行文件MySQL 无法写入数据目录 → chown -R mysql:mysql /var/lib/mysql依赖服务未启动 先启动依赖服务,再启动目标服务 Tomcat 依赖 Java → 先装 JDK 再启动 systemctl start tomcat端口被占用 参考下文「端口占用问题」解决 Nginx 占用 80 端口失败 → 找到占用进程并终止
二、 服务端口被占用
故障现象
服务启动时报 address already in use,或 netstat/ss 显示端口被其他进程占用。
排查步骤
-
查找占用端口的进程
bash
运行
# 方法1:ss 命令(推荐,比 netstat 高效) ss -tulnp | grep 端口号 # 方法2:netstat 命令 netstat -tulnp | grep 端口号输出结果中
PID/进程名即为占用端口的进程。 -
解决端口占用
-
方案 1:终止占用进程(适用于无关进程) bash
运行
kill -9 进程PID # 强制终止进程 -
方案 2:修改服务端口(适用于无法终止的进程)编辑服务配置文件,更换未被占用的端口,重启服务。
-
方案 3:配置服务端口复用(部分服务支持)如 Nginx 可配置
listen 端口号 reuseport;
-
三、 服务开机自启失效
故障现象
系统重启后,已配置 enable 的服务未自动启动。
排查步骤
-
检查自启状态
bash
运行
systemctl is-enabled 服务名- 若显示
disabled→ 重新执行systemctl enable 服务名 - 若显示
enabled但未启动 → 继续下一步
- 若显示
-
检查服务是否被 mask(冻结)
bash
运行
systemctl is-masked 服务名若显示
masked→ 先解除冻结再启用bash
运行
systemctl unmask 服务名 systemctl enable 服务名 --now # --now 立即启动服务 -
检查系统启动优先级 部分服务因启动优先级过低,依赖资源未就绪导致启动失败,可通过
systemctl edit 服务名调整启动顺序。
四、 服务运行中异常崩溃
故障现象
服务启动后一段时间自动退出,status 显示 active(failed) 或 inactive(dead)。
排查步骤
-
查看崩溃前日志
bash
运行
journalctl -u 服务名 -e # -e 跳转到日志末尾重点关注崩溃前的
ERROR/FATAL级日志。 -
检查系统资源
- 内存不足:
free -h→ 测试环境扩容或关闭无关服务 - 磁盘满:
df -h→ 清理日志 / 临时文件(如/var/log下的旧日志) - CPU 过高:
top→ 排查服务是否存在内存泄漏或死循环
- 内存不足:
-
测试环境临时解决方案配置服务自动重启,避免频繁手动干预:
bash
运行
systemctl edit 服务名在打开的文件中添加以下内容,保存退出:
ini
[Service] Restart=always RestartSec=3 # 崩溃后3秒自动重启重新加载配置并重启服务:
bash
运行
systemctl daemon-reload systemctl restart 服务名
五、 传统 service 命令环境故障排查补充
对于 CentOS 6 等老旧系统,无 journalctl 日志工具,需:
- 查看服务脚本日志:
/var/log/messages或/var/log/服务名.log - 检查
/etc/init.d/服务名脚本是否有执行权限:chmod +x /etc/init.d/服务名 - 配置自启:
chkconfig 服务名 on