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
相关产品推荐
相关产品推荐

