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

Gor*_*ght 33 ubuntu ruby-on-rails ruby-on-rails-3 ubuntu-11.04

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

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

我发现了一个类似的问题,忽略了对Webbrick服务器的CTRL + C,但目前还不清楚这个问题是否描述了同样的根本问题.此外,分辨率似乎不适用,因为我没有在我的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
Run Code Online (Sandbox Code Playgroud)

该问题是由Rails的互动与宝石造成的事实使我现在相信,这个问题实际上涉及到CTRL + C来Webbrick服务器忽略的,虽然上面的测试情况表明,这一个显然不会使用造成的: 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
Run Code Online (Sandbox Code Playgroud)

这可以解释这个问题和CTRL + C与Webbrick服务器之间的看似相似性被忽略了.我的预感是他们提到的宝石也会进行系统调用.

Str*_*ent 18

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

我有同样的问题,发现fg在打字后恢复(使用)ctrl- c然后暂停(使用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
    
    Run Code Online (Sandbox Code Playgroud)

    ^ 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
    
    Run Code Online (Sandbox Code Playgroud)


Jam*_*ney 8

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

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


sar*_*old 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
Run Code Online (Sandbox Code Playgroud)

(存在非常相似的代码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.
Run Code Online (Sandbox Code Playgroud)

没有控制tty意味着由终端(产生的信号^Z SIGTSTP,^\ SIGKILL,SIGTTIN,SIGTTOU即使它已经启动该终端上,等)不能达到的过程.该链接已被切断.


Gor*_*ght 6

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

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

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