无法在Ubuntu 11.04上使用ctrl-c停止WEBrick 1.3.1

时间:2011-05-05 01:02:00

标签: ruby-on-rails ruby-on-rails-3 ubuntu ubuntu-11.04

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

从另一个终端标准杀死进程也不起作用,但当然是kill -9。

我发现了一个类似的问题CTRL+C to Webbrick server ignored,但目前还不清楚这个问题是否描述了同样的根本问题。此外,分辨率似乎不适用,因为我没有在我的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 to Webbrick server ignored相关,尽管上面的测试案例表明这个一个显然不是因为使用:git for a gem。

更新2:

更新1 中,我提到我将其缩小为宝石。当我浏览那个宝石时,我最终找到了真正的罪魁祸首。宝石正在进行一次系统调用。我对测试脚本做了一个非常小的修改,我不再加载barista 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 to Webbrick server ignored之间看似相似的问题。我的预感是,他们提到的宝石也会进行系统调用。

13 个答案:

答案 0 :(得分:18)

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

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

所以食谱是:

  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,然后是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
    

答案 1 :(得分:8)

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

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

答案 2 :(得分:6)

我相信^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^\ SIGKILLSIGTTIN生成的信号, SIGTTOU等)即使已在该终端上启动,也无法到达该过程。该链接已被切断。

答案 3 :(得分:6)

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

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

回归已修补,看起来补丁最近进入了Ubuntu的更新,所以如果你受到这个问题的影响,你应该应用最新的更新。

答案 4 :(得分:3)

在Mac OS X上也出现了这种情况。

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

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

我怀疑红宝石的select正在捕捉信号。

以下是两种阻止服务器的方法:

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 }

其中server是您的WEBrick服务器对象。

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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

我自己遇到了这个问题。我正在使用rvm rails 3.0.9和ubuntu 11.04 32bit运行统一。我发现终结器会将 Ctrl + c 传递给rails。

答案 7 :(得分:1)

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

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

设置为(ctrl + shift +`)或任何你喜欢的东西

答案 8 :(得分:0)

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

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

在U10.04中,我遇到了运行webrick,mongrel,console,sqlite的问题,实际上我运行的并不重要。

答案 9 :(得分:0)

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

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

rails s

那里。 Ctrl + C 可重复使用,并停止服务器。

希望我能帮忙! :)

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

答案 10 :(得分:0)

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

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

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

我和你们所有人都有同样的问题,ctrl + C被忽略了;但是如果我删除了这个gem依赖项,(并且我删除了de相关的初始化程序)问题就消失了,我可以像以前一样使用ctrl + c。

我可以认为这是与rails_admin gem相关的错误,但正如我在其他问题中读到的那样: CTRL+C to Webbrick server ignored 它更可能与使用:git参数的任何gem相关......

希望它有所帮助。

答案 11 :(得分:0)

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

stty -echoctl

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

只参加一个课程。 在附近发布更好的解决方案。

答案 12 :(得分:0)

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

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