You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Alpine Linux中init.d管理的Redis Sentinel无法停止问题

解决Alpine Linux中Redis Sentinel无法正常停止的问题

你的Sentinel启动脚本的stop函数存在几个关键问题,导致start-stop-daemon没能正确识别并终止Redis Sentinel进程。下面一步步帮你排查和修复:

1. 核心问题:Stop函数缺少可执行文件匹配逻辑

当前stop函数仅通过--pidfile参数定位进程,但如果pid文件中的PID已失效、被其他进程复用,或者start-stop-daemon无法关联到正确的可执行文件,就会出现"提示停止成功但进程仍在运行"的情况。

修复Stop函数

修改/etc/init.d/sentinel中的stop函数,添加--exec参数明确指定要终止的可执行文件,确保只杀掉Redis Sentinel进程:

stop() {
    # 先确保能正确读取配置,失败则直接返回
    get_config || return 1
    ebegin "Stopping $name"
    start-stop-daemon --stop --retry 30 --pidfile "${pidfile}" --exec "${command}"
    eend $?
}

2. 优化配置读取逻辑(可选但推荐)

当前get_config函数的awk命令没有过滤注释行,如果配置文件里有以#开头的注释行包含pidfile、logfile等关键词,可能会读取到错误的值。可以更新awk命令忽略注释:

get_config() {
    if [ ! -f "${SENTINEL_CONF}" ] ; then
        eerror "You need a ${SENTINEL_CONF} file to run redis"
        return 1;
    fi
    # 过滤注释行,只读取非注释的配置项
    pidfile=$(awk '$1 == "pidfile" && $0 !~ /^#/ { print $2 }' "$SENTINEL_CONF")
    logfile=$(awk '$1 == "logfile" && $0 !~ /^#/ { print $2 }' "$SENTINEL_CONF")
    dir=$(awk '$1 == "dir" && $0 !~ /^#/ { print $2 }' "$SENTINEL_CONF")
    : ${pidfile:=/var/run/redis/sentinel.pid}
    : ${logfile:=/var/log/redis/sentinel.log}
    : ${dir:=/var/lib/redis}
}

3. 验证PID文件的正确性

在执行停止命令前,先确认PID文件是否有效:

# 查看PID文件中的进程ID
cat /var/run/redis/sentinel.pid
# 验证该PID是否为Redis Sentinel进程
ps aux | grep $(cat /var/run/redis/sentinel.pid)

如果输出中没有redis-sentinel相关进程,说明PID文件已失效,这也会导致start-stop-daemon无法正确终止进程。

4. 测试修复后的脚本

修改完成后,重新启动Sentinel并测试停止命令:

/etc/init.d/sentinel restart
/etc/init.d/sentinel stop
# 检查进程是否已终止
ps aux | grep redis-sentinel

这样就能解决"提示停止但进程仍运行"的问题了。

内容的提问来源于stack exchange,提问作者Soham Dasgupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:22:58