大家好。
我在重建(更新)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 运行,尽管在几次升级之前从未出现过这种问题。
任何帮助和建议都将不胜感激,如果这个问题在其他主题中已经解决,我很抱歉,但我搜索无果。