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

问题描述 投票:33回答:13

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

从另一个终端标准杀死进程也不起作用,但当然杀掉-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 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之间看似相似的问题。我的预感是他们提到的宝石也会进行系统调用。

ruby-on-rails ruby-on-rails-3 ubuntu ubuntu-11.04
13个回答
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

0
投票

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

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

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

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

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

希望它有所帮助。


0
投票

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

stty -echoctl

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

只工作一次。发布更好的解决方案。


0
投票

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

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

rails s

那里。 Ctrl + C可以在我身上重复使用并停止服务器。

希望我能帮忙! :)

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


0
投票

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

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


8
投票

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

有关更多信息,请访问超级用户查看此问题:https://superuser.com/questions/243460/what-to-do-when-ctrl-c-cant-kill-a-process


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^\ SIGKILLSIGTTINSIGTTOU等)即使在该终端上启动也无法到达该过程。该链接已被切断。


6
投票

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

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

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


3
投票

这在Mac OS X上也适用于我。

令人惊讶的是,RackWEBrick都没有设置自定义信号处理程序。我把它放在我的机架应用程序的call方法中,它告诉我SIGINT的DEFAULT处理程序是当前的(返回String "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添加处理程序。


1
投票

使用此行用ccsm创建快捷方式(compiz conig settings manager或smth like this) - >命令:

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

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


1
投票

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


1
投票

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


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.