Ruby on Rails 控制台在加载时挂起
Posted
技术标签:
【中文标题】Ruby on Rails 控制台在加载时挂起【英文标题】:Ruby on Rails console is hanging when loading 【发布时间】:2014-09-21 12:45:56 【问题描述】:由于某种原因,Ruby on Rails 控制台拒绝启动;它只是挂起。我没有对我的代码进行任何更改,使用相同版本的 Ruby 和 Ruby on Rails 的其他项目也没有问题。当我最终 Ctrl + C 我得到这个堆栈跟踪,它指向 Spring。
我无法解释为什么会从一瞬间发生这种情况,而它工作正常。我已经通过 RVM 清除了所有的 gem,并通过 bundle 命令重新安装,但仍然没有运气。任何想法将不胜感激。
据我所知,Ruby on Rails 服务器也没有问题。该问题与项目相关,但没有更改任何代码,只有 Ruby on Rails 控制台存在问题。
Ruby 2.1.2 导轨 4.1.4
user_a@ubuntu:~/work/app_a$ rails console
^C/home/user_a/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/client/run.rb:54:in `gets': Interrupt
from /home/user_a/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/client/run.rb:54:in `verify_server_version'
from /home/user_a/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/client/run.rb:25:in `call'
from /home/user_a/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/client/command.rb:7:in `call'
from /home/user_a/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/client/rails.rb:23:in `call'
from /home/user_a/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/client/command.rb:7:in `call'
from /home/user_a/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/client.rb:26:in `run'
from /home/user_a/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/bin/spring:48:in `<top (required)>'
from /home/user_a/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/binstub.rb:11:in `load'
from /home/user_a/.rvm/gems/ruby-2.1.2/gems/spring-1.1.3/lib/spring/binstub.rb:11:in `<top (required)>'
from /home/user_a/work/app_a/bin/spring:16:in `require'
from /home/user_a/work/app_a/bin/spring:16:in `<top (required)>'
from bin/rails:3:in `load'
from bin/rails:3:in `<main>'
user_a@ubuntu:~/work/app_a$
【问题讨论】:
【参考方案1】:重启 Spring 应该可以修复挂起的命令:
$ bin/spring stop
在删除并重新创建新的 Ruby on Rails 应用程序后,我遇到了挂起的命令(rake、bin/rails 等)。谷歌没有那么有帮助。我希望是这样。
当您重新运行命令时,Spring 将自动启动。
【讨论】:
这对我来说适用于 Rails 4.1.1。我需要阅读 Spring gem 以了解它在做什么。 @cee-dub 但背后的原因是什么,为什么 spring 不让它运行 rails 控制台? 这对我不起作用。停止弹簧后我仍然遇到问题。 刚刚遇到这个问题:当我运行bin/spring stop
时,我收到了Spring is not running.
的响应所以,我运行ps aux | grep spring
,看到5个spring进程正在运行,并手动杀死它们,从而修复了问题。
太棒了!永远不会猜到。【参考方案2】:
我猜是 Spring gem 版本有问题。
转到您的 Gemfile 并评论 gem 'spring'。然后运行bundle install
再试一次。
# gem 'spring'
然后:
bundle install
如果您的工作依赖于 gem,请尝试通过以下方式更新 gem:
bundle update
【讨论】:
这在 Linux Mint 和 rails 4.1.4 上也为我解决了这个问题 警惕bundle update
。如果你这样做,你就有机会在整个环境中彻底改变你的 gem 版本。这会引入很多你不想要的副作用。你也可以bundle update spring
只更新一颗宝石
@jaydel 您应该始终将您的版本放在您的 gemfile 中,包括路径版本。 Bundler 会自动更新次要版本,但不会更新主要版本,但您可以随时回滚到您最初指定的版本(您知道您的应用可以在其中运行)。
关于将版本放入您的 Gemfile 中——同意。我不知道更新到主要版本的限制,但是当我仔细考虑时它是有道理的:) 很好的信息,谢谢【参考方案3】:
当怀疑Spring是怪异的原因时,尝试运行这个命令:
spring stop && spring start
【讨论】:
【参考方案4】:如果$ bin/spring stop
不能解决问题,请检查以确保没有仍然存在的孤立 Spring 进程:
$ ps aux | grep -i spring
如果你看到类似的东西
user 7163 0.0 0.0 110356 2165 pts/3 S+ 19:40 0:00 grep --color=auto -i spring
user 16980 0.0 0.4 398826 17580 ? Sl Aug31 0:00 spring server | current | started 277 hours ago
然后杀死错误的spring进程并尝试再次启动控制台:
$ kill -9 16980
$ rails c
【讨论】:
【参考方案5】:像这样在 spring gem 的 lib/application.rb 文件中更改以下方法(路径可以使用 gem info spring 命令显示)就可以了:
def eager_preload
with_pty do
# we can't see stderr and there could be issues when it's overflown
# see https://github.com/rails/spring/issues/396
STDERR.reopen("/dev/null")
preload
end
end
见https://github.com/markiz/spring/commit/5f3ab734fc45d541aaaccb05b59cd95aa49fe8ef
【讨论】:
以上是关于Ruby on Rails 控制台在加载时挂起的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Ruby on Rails 的控制台中调用控制器/视图辅助方法?
Ruby on Rails - 需要重新加载模型时的不一致性?