Ruby on rails - 无法在 Ubuntu 11.04 上使用 ctrl-c 阻止 WEBrick 1.3.1



我正在使用RVM,Ruby 1.9.2和Rails 3.0.7

从另一个终端对进程进行标准终止也不起作用,但 kill -9 当然可以。

我发现了一个类似的问题,CTRL + C到Webbrick服务器被忽略了,但目前还不清楚这个问题是否描述了相同的潜在问题。 此外,该分辨率似乎不适用,因为我没有在我的 Gemfile 中使用 :git。

更新 1:(现在很旧...请参阅下面的更新 2,了解真正的独家新闻)

我设法将问题缩小到一个宝石。 如果您获取以下测试脚本,您也可以看到问题(假设您使用的是 Ubuntu 11.04......10.04 中没有问题)

rm -rf tmpkilltest
rvm 1.9.2
rvm --force gemset delete tmpkilltest
rvm gemset create tmpkilltest
rvm 1.9.2@tmpkilltest
gem install rails -v=3.0.7 --no-rdoc --no-ri
gem install sqlite3 -v=1.3.3 --no-rdoc --no-ri
rails new tmpkilltest
cd tmpkilltest
echo "gem 'barista', '1.0'" >> Gemfile
bundle
rails s

事实上,这个问题是由 Rails 与 gem 的交互引起的,这让我现在相信这个问题实际上与 CTRL+C 到 Webbrick 服务器被忽略有关,尽管上面的测试用例表明这个问题显然不是由使用 :git 作为 gem 引起的。

更新 2:

更新 1 中,我提到我将其缩小到宝石。 当我穿过那颗宝石时,我最终找到了真正的罪魁祸首。 Gem 正在进行单个系统调用。 我对测试脚本进行了非常小的修改,不再加载咖啡师 gem,而是简单地在 application.rb 的末尾附加一个系统调用。 使用该系统调用时,ctrl-c 不起作用。 删除系统调用,它确实有效。

rm -rf tmpkilltest
rvm 1.9.2
rvm --force gemset delete tmpkilltest
rvm gemset create tmpkilltest
rvm 1.9.2@tmpkilltest
gem install rails -v=3.0.7 --no-rdoc --no-ri
gem install sqlite3 -v=1.3.3 --no-rdoc --no-ri
rails new tmpkilltest
cd tmpkilltest
bundle
echo "`date`" >> config/application.rb
rails s

这可以解释这个问题与忽略的 CTRL+C 之间的相似之处。 我的预感是,他们提到的宝石也会进行系统调用。

我宁愿发表评论也不愿为此添加答案,但没有足够的代表。

我有同样的问题,发现在键入 ctrl-c 然后暂停(如上所述使用ctrl-z)后恢复(使用 fg)可以解决问题

所以食谱是:

  1. Ctrl-C(立即不执行任何操作)
  2. ctrl-z (暂停 WEBrick,回到 shell)
  3. fg(恢复WEBrick,立即跟进SIGINT)

    lampadmin@lampadmin-DX4840:/var/www/rails/agences$ r s
    => Booting WEBrick
    => Rails 3.0.5 application starting in development on http://0.0.0.0:3000
    => Call with -d to detach
    => Ctrl-C to shutdown server
    [2011-05-14 14:25:36] INFO  WEBrick 1.3.1
    [2011-05-14 14:25:36] INFO  ruby 1.9.2 (2011-02-18) [x86_64-linux]
    [2011-05-14 14:25:36] INFO  WEBrick::HTTPServer#start: pid=2585 port=3000
    

    ^C^Z (<-- ctrl-c, then ctrl-z)

    [1]+  Stopped                 rails s
    lampadmin@lampadmin-DX4840:/var/www/rails/agences$ fg
    rails s
    [2011-05-14 14:25:45] INFO  going to shutdown ...
    [2011-05-14 14:25:45] INFO  WEBrick::HTTPServer#start done.
    Exiting
    

我遇到了类似的问题,一直在使用 Ctrl+Z 暂停作业,然后kill -9 %1终止第一个暂停的作业。迂回的杀死它的方式,但它有效。

有关详细信息,请参阅超级用户上的此问题:https://superuser.com/questions/243460/what-to-do-when-ctrl-c-cant-kill-a-process

我相信^C不能杀死WEBrick服务器,因为服务器创建了一个新会话:

webrick/server.rb

  class Daemon
    def Daemon.start
      exit!(0) if fork
      Process::setsid
      exit!(0) if fork
      Dir::chdir("/")
      File::umask(0)
      STDIN.reopen("/dev/null")
      STDOUT.reopen("/dev/null", "w")
      STDERR.reopen("/dev/null", "w")
      yield if block_given?
    end
  end

rack/server.rb中存在非常相似的代码,所以如果你通过机架启动WEBrick,你可能希望省略-D--daemonize命令行选项。

setsid(2)手册页:

   setsid() creates a new session if the calling process is not
   a process group leader.  The calling process is the leader of
   the new session, the process group leader of the new process
   group, and has no controlling tty.

没有控制 TTY 意味着终端(^Z SIGTSTP^ SIGKILLSIGTTINSIGTTOU等)产生的信号即使在该终端上启动也无法到达进程。链接已断开。

好的

,问题已经为我解决了。 我作为 Ubuntu 标准更新的一部分应用了最近的内核更新,解决了这个问题。

另外,这是对该问题的一个很好的讨论,它解释了根本原因是 2.6.38 (http://redmine.ruby-lang.org/issues/4777) 中引入的内核回归

回归已修补,看起来该补丁最近进入了 Ubuntu 的更新,因此如果您受到此问题的影响,则应应用最新更新。

这在Mac OS X上也发生在我身上。

令人惊讶的是,RackWEBrick 都没有设置自定义信号处理程序。我把它放在我的机架应用程序的call方法中,它告诉我 SIGINT 的DEFAULT处理程序是当前的处理程序(返回字符串"DEFAULT"):

p Signal.trap('INT', 'DEFAULT')

我怀疑 Ruby 的select中发生了什么东西,正在捕获信号。

以下是停止服务器的 2 种方法:

1) 按 Ctrl-z 暂停。然后kill -ABRT pid_or_job_id.我不知道这个过程退出得有多"干净"。这很烦人,但您不必添加任何代码。

2a) 如果您使用的是 Rack,请在调用 Rack::Handler::WEBrick.run 之前添加以下内容:

Signal.trap('INT') {
  Rack::Handler::WEBrick.shutdown
}

2b) 如果您使用的是香草WEBrick

Signal.trap('INT') { server.shutdown }

其中serverWEBrick服务器对象。

如果您要经常使用SIGINT,这些都很好。您可能还希望为TERMHUP添加处理程序。

使用此行使用 ccsm(compiz conig Settings Manager 或像这样的 smth)创建快捷方式 ->命令:

kill -9 `pgrep -fl 'script/rails s' | awk '{print $1}'`

设置为 (Ctrl+Shift+') 或您喜欢的任何内容

我在

更新 Ubuntu 时遇到了同样的问题。使用Ctrl + C无法正常退出webrick,不得不使用kill -9...

我自己也遇到了这个问题。 我正在使用 rvm rails 3.0.9 和 ubuntu 11.04 32 位运行 unity。 我发现终结者会将 Ctrl+c 传递给轨道。

似乎是 Unity 和终端的问题 由于某种原因,^c 未正确处理。 尝试使用terminator(更好的终端)做同样的事情。或者只是使用侏儒。

至少这就是我解决问题的方式。我建议我们把它移到 askubuntu.com。

在 U10.04 中,我在运行 webrick、mongrel、console、sqlite 时遇到了这个问题,我实际运行什么并不重要。

我的最后一个答案被删除了不知道为什么,但我再试一次,因为我真的认为这与问题非常相关。

在我的 Gemfile 中,我只有一个 gem 使用参数 :git。

gem 'rails_admin', :git => 'git://github.com/sferik/rails_admin.git'

我有同样的问题,ctrl + C被忽略; 但是如果我删除这个gem依赖项,(并且我删除了相关的初始值设定项),问题就消失了,我可以像以前一样使用ctrl + c。

我可以认为这是一个与rails_admin宝石相关的错误,但正如我在另一个问题中读到的那样:CTRL+C 到 Webbrick 服务器忽略它更有可能与使用 :git 参数的任何 gem 相关......

希望它有帮助。

找到了某种解决方案。在终端中运行:

stty -echoctl

然后 Ctrl-C 将起作用。http://linux.m2osw.com/remove-ctrl-C-from-being-printed-in-console

只工作了一个会话。附近张贴了更好的解决方案。

有趣的经验(以及接下来几周的良好解决方法):

如果您在 Ubuntu 下并使用 Guake 进行快速终端访问,您可以启动

rails s

那里。Ctrl + C 可重复地为我工作并停止服务器。

希望我能帮上忙! :)

编辑:显然这对每个人来说都是不可重复的,这是我的设置:Ubuntu 11.04,32 位,Guake 0.4.2-4ubuntu1

如果 ctr+c 不工作,然后在实现上述方法之前,只需查看您的终端设置即可。有时我们可能会为了方便而更改终端的快捷键。我们分配 ctr+c 用于复制终端的内容。在这种情况下,ctr+c 将不适用于停止服务器,而是用作复制目的。

如果未更改设置,请尝试使用其他端口,如 4000。

相关内容

  • 没有找到相关文章

最新更新