AI回复: 这个问题很典型。让我分析 root cause。
诊断:systemctl start redis 卡住的原因
这是 Type=notify 的经典问题。systemd 启动 Redis 后,会一直等待 Redis 通过 sd_notify() 发送 READY=1 信号,
如果 Redis 启动过程中未能完成通知,systemctl start 就会一直卡在"执行命令中"。
根因分析
结合 openEuler 2203 的环境特征,最可能的原因是 /run/redis 目录权限问题:
RuntimeDirectory=redis # systemd 创建 /run/redis
RuntimeDirectoryMode=0755 # 但 mode=0755 属主可能是 root
User=redis # Redis 以 redis 用户运行
在 openEuler 2203(systemd v249)上,RuntimeDirectory 配合 UMask=0077 时,/run/redis 的属主未能正确切换为 redis:redis,
导致 Redis 启动时无法写入 pidfile /run/redis/redis.pid,初始化流程中断,READY=1 永远不会发出。
tmpfiles.d 已经是 0750,保持一致。更新 spec 的 changelog:
已推送。以下是完整的诊断与修复说明:
诊断结论
systemctl start redis 卡在"执行命令中"的根因:
事件链
systemd 创建 /run/redis (RuntimeDirectory=redis)
↓ mode=0755, owner=root (部分 systemd 版本自动 chown 失败)
↓
Redis 以 User=redis 启动
↓
Redis 试图写入 pidfile /run/redis/redis.pid
↓ ↑ 权限不足 ✗
Redis 初始化流程中断,无法发出 READY=1
↓
systemd Type=notify 永远等待 notify 信号
↓
systemctl start 卡住
修复措施
| 变更 | 文件 | 说明 |
|---|
RuntimeDirectoryMode 0755 → 0750 | redis.service + redis-sentinel.service | 收紧权限,与 tmpfiles.d 一致 |
新增 ExecStartPre | redis.service + redis-sentinel.service | chown redis:redis /run/redis && chmod 0750 /run/redis 作为 systemd 自动 chown 的兜底保障 |
安装后验证
在 openEuler 2203 上安装更新后的 RPM 后,建议执行:
# 重载 service 单元
systemctl daemon-reload
# 查看启动日志(最直接的诊断手段)
journalctl -u redis -n 50 --no-pager
# 启动 Redis
systemctl start redis
systemctl status redis
如果仍有问题,journalctl -u redis 的输出能精确指出 Redis 在启动的哪一步卡住。
最新评论