在Ubuntu 11.04上,不能使用ctrl-c来停止WEBrick 1.3.1

我使用的是RVM,Ruby 1.9.2和Rails 3.0.7

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

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

更新1:(现在老…见下面更新2,为真正的独家新闻)

我设法把问题缩小到一个gem。 如果你input下面的testing脚本,你也可以看到这个问题(假设你在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服务器被忽略有关 ,尽pipe上面的testing用例显示这个问题显然不是由于使用: Git的gem。

更新2:

更新1中,我提到我把它缩小到了一个gem。 当我经历了那个gem,我终于find了真正的罪魁祸首。 gem正在进行一个系统调用。 我对testing脚本做了一个很小的修改,我不再加载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到Webbrick服务器忽略的看似相似之处。 我的直觉是,他们提到的gem也是一个系统调用。

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

我有同样的问题,发现后,键入ctrlc然后暂停(与ctrlz ,如上所述)恢复(与fg )的诀窍。

所以配方是:

  1. ctrlc (什么都不做)
  2. ctrlz (暂停WEBrick,返回到shell)
  3. fg (恢复WEBrick,立即通过SIGINT进行)

     lampadmin@lampadmin-DX4840:/var/www/rails/agences$ rs => 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 

我有类似的问题,一直使用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') 

我怀疑是红宝石的select正在陷入信号。

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

1)按ctrl-z暂停。 然后kill -ABRT pid_or_job_id 。 我不知道这个过程是如何“干净”的。 这是烦人的,但你不必添加任何代码。

2a)如果您使用Rack,请在调用Rack::Handler::WEBrick.run之前添加此权限:

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

2b)如果您使用的是vanilla WEBrick

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

server是您的WEBrick服务器对象。

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

使用这一行来创建ccsm的快捷方式(compiz conig设置管理器或像这样的smth) – >命令:

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

设置为(Ctrl + Shift +`)或任何你喜欢的

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

我自己遇到了这个问题。 我使用rvm rails 3.0.9和ubuntu 11.04 32bit运行统一。 我发现终结者将通过Ctrl + C导轨。

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

至少我是这样解决问题的。 我建议我们把这个移动到askubuntu.com。

在U10.04我有这个问题运行webrick,杂种,控制台,sqlite,它并不重要什么,我跑了。

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

在我的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到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

如果Ctrl + c不起作用,那么在执行上面提到的方法之前,先看看你的终端设置。 有时可能会出现我们为了方便而更改终端的快捷键。 我们分配Ctrl + C复制终端的内容。 在这种情况下, Ctrl + c将无法用于停止服务器,而是将其用作复制目的。

如果设置没有改变,则尝试使用另一个端口,如4000。