将 USR2 发送到 mongrel_rails 有时会导致重新启动时出现“地址已被使用”

将 USR2 发送到 mongrel_rails 有时会导致重新启动时出现“地址已被使用”

我们的混合集群有一个滚动重启模式,可以向每个正在运行的进程发送 USR2 信号。

在大多数情况下,这种方法效果很好。但偶尔,mongrel 进程会关闭,然后无法重新启动,并出现以下错误:

/usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel/tcphack.rb:12:in `initialize_without_backlog': Address already in use - bind(2) (Errno::EADDRINUSE)
from /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel/tcphack.rb:12:in `initialize'
from /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel.rb:93:in `new'
from /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel.rb:93:in `initialize'
from /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel/configurator.rb:139:in `new'
from /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel/configurator.rb:139:in `listener'

通过查看 mongrel 源代码,USR2 处理程序在正在运行的服务器上调用同步停止,因此它应该阻塞直到套接字被释放。

有人见过这个错误吗?

有人知道这是什么原因造成的吗?

(我最初在 StackOverflow 上问过这个问题,但认为在这里问可能更合适)

答案1

我有同样的错误...我不知道为什么。

似乎我的 Mongrels 会随机地在重启或其他情况下保持端口打开,并且无法再次启动。起初我以为这可能是 monit 错误,然后我将其更改为上帝,同样的事情还在发生……

相关内容