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 - 需要重新加载模型时的不一致性?

Ruby on Rails - 未捕获的ReferenceError:$未定义

从打开的导航抽屉呈现视图控制器时挂起

Ruby on Rails - 未捕获的 ReferenceError:$ 未定义