重建 ./launcher 期间出现问题,第二次启动 Redis 失败

大家好。

我在重建(更新)Discourse 时遇到了问题;在日志中我发现,在设置过程中,第一次启动 Redis 没有问题,但过了一会儿,设置尝试再次启动它时崩溃了,错误信息是“server TCP listening socket *:6379: bind: Address already in use”(服务器 TCP 监听套接字 *:6379: 绑定:地址已被使用)。

经过多次尝试和错误,也得到了 Gemini 的帮助,我在 app.yml 中加入了以下代码片段:

hooks: before_db_migrate: - exec: cmd: - "pkill -9 redis-server || true" - "sleep 2" - "exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf &" - "sleep 5"

最终重建得以继续。

这是修复后杀死那个顽固的 Redis 实例并重新启动它的日志片段:


389:C 24 Feb 2026 17:07:21.756 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo

389:C 24 Feb 2026 17:07:21.756 * Redis version=7.4.7, bits=64, commit=00000000, modified=1, pid=389, just started

389:C 24 Feb 2026 17:07:21.756 * Configuration loaded

389:M 24 Feb 2026 17:07:21.756 * monotonic clock: POSIX clock_gettime

389:M 24 Feb 2026 17:07:21.757 * Running mode=standalone, port=6379.

389:M 24 Feb 2026 17:07:21.757 # Warning: Could not create server TCP listening socket *:6379: bind: Address already in use

389:M 24 Feb 2026 17:07:21.757 # Failed listening on port 6379 (tcp), aborting.

I, [2026-02-24T17:07:31.750972 #1]  INFO -- : > pkill -9 redis-server || true

I, [2026-02-24T17:07:31.758767 #1]  INFO -- : > sleep 2

I, [2026-02-24T17:07:33.761955 #1]  INFO -- : > exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf &

I, [2026-02-24T17:07:33.765205 #1]  INFO -- : > sleep 5

396:C 24 Feb 2026 17:07:33.773 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo

396:C 24 Feb 2026 17:07:33.773 * Redis version=7.4.7, bits=64, commit=00000000, modified=1, pid=396, just started

396:C 24 Feb 2026 17:07:33.773 * Configuration loaded

396:M 24 Feb 2026 17:07:33.773 * monotonic clock: POSIX clock_gettime

396:M 24 Feb 2026 17:07:33.774 * Running mode=standalone, port=6379.

396:M 24 Feb 2026 17:07:33.775 * Server initialized

396:M 24 Feb 2026 17:07:33.776 * Loading RDB produced by version 7.4.7

396:M 24 Feb 2026 17:07:33.776 * RDB age 19606 seconds

396:M 24 Feb 2026 17:07:33.776 * RDB memory usage when created 4.60 Mb

396:M 24 Feb 2026 17:07:33.787 * Done loading RDB, keys loaded: 3413, keys expired: 1.

396:M 24 Feb 2026 17:07:33.788 * DB loaded from disk: 0.013 seconds

396:M 24 Feb 2026 17:07:33.788 * Ready to accept connections tcp

我现在的问题是:为什么启动两次 Redis?为什么第二次启动时发现第一次仍然占用着 6379 端口?再次,为什么不尝试使用它,如果它已经可用了呢?

最后,是什么导致了这个问题?我很清楚我只是在没有弄清“伤口”原因的情况下敷了药膏,但至少现在它能运行了。

在有人问我之前,不,我没有在 Discourse 外部运行任何其他的 Redis(否则,重建开始时的第一次尝试就应该崩溃了),是的,Discourse 在许多其他容器上通过 Docker 运行,尽管在几次升级之前从未出现过这种问题。

任何帮助和建议都将不胜感激,如果这个问题在其他主题中已经解决,我很抱歉,但我搜索无果。