Ruby on Rails控制台在加载时卡住了

176

由于某些原因,Ruby on Rails控制台无法启动;它只是挂起了。我没有对我的代码进行任何更改,使用相同版本的Ruby和Ruby on Rails的其他项目没有任何问题。当我最终使用Ctrl + C时,我得到了这个指向Spring的堆栈跟踪。

我无法解释为什么会突然出现这种情况,在之前它一直工作得很好。我已经通过RVM清除了所有的gems,并通过bundle命令重新安装了所有的gems,但仍然没有运气。如果有任何想法,将不胜感激。

此外,据我所知,Ruby on Rails服务器没有问题。问题与项目相关,但代码没有更改,只有Ruby on Rails控制台存在问题。

Ruby 2.1.2
Rails 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$
5个回答

488

重新启动Spring应该可以解决挂起的命令:

$ bin/spring stop

在删除并重新创建一个新的Ruby on Rails应用程序后,我遇到了命令挂起的问题(rake,bin/rails等)。谷歌并没有提供太多帮助。希望这可以解决你的问题。

当您重新运行命令时,Spring将自动启动。


这对我在Rails 4.1.1中有效。我需要阅读Spring gem以了解它在做什么。 - jetimms
1
@cee-dub 但是这背后的原因是什么呢?为什么Spring不让Rails控制台运行起来? - kamal
3
这对我没有用。在停止Spring之后,我仍然遇到问题。 - Donato
5
刚刚遇到了这个问题:当我运行 bin/spring stop 时,收到了响应 Spring is not running. 然后,我运行了 ps aux | grep spring,发现有5个Spring进程在运行,然后手动杀死它们,问题得以解决。 - Ian Taylor
已确认适用于 Rails 6.1.3.2 版本。 - glinda93
显示剩余2条评论

11

当怀疑 Spring 是引起异常的原因时,请尝试运行此命令:

当怀疑Spring是造成异常的原因时,尝试运行此命令:

spring stop && spring start

7

我猜是Spring gem版本出了问题。

进入你的Gemfile,注释掉gem 'spring' 这一行。然后运行bundle install再试一次。

# gem 'spring'

然后:

bundle install

如果你的工作依赖于这个 gem,尝试通过以下方式更新 gems:

bundle update

这对我在Linux Mint上使用rails 4.1.4也解决了问题。 - slhck
3
小心使用 bundle update 命令。如果你这样做,你有机会彻底改变整个环境下 gem 的版本。这可能会引入许多不想要的副作用。你也可以使用 bundle update spring 来只更新一个 gem。 - user483040
@jaydel 你应该始终将你的版本号放在gemfile中,包括路径版本。Bundler会自动更新小版本,但不会更新大版本,但是你可以随时回滚到最初指定的版本(你知道你的应用程序可以正常工作的版本)。 - Ben Aubin
关于在Gemfile中放置版本的问题 - 我同意。我不知道更新到主要版本会有限制,但是当我仔细想一想时,这是有道理的 :) 很好的信息,谢谢。 - user483040

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

2

将spring宝石的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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接