我使用的是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也是一个系统调用。
我宁愿评论也不愿为此添加一个答案,但没有足够的代表。
我有同样的问题,发现后,键入ctrl – c然后暂停(与ctrl – z ,如上所述)恢复(与fg
)的诀窍。
所以配方是:
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
, ^\
SIGKILL
, SIGTTIN
, SIGTTOU
等)产生的信号即使在该终端上已经启动,也不能到达该过程。 链接已被切断。
好的,这个问题已经解决了。 最近的内核更新,我作为Ubuntu标准更新的一部分应用,解决了这个问题。
另外,这里对这个问题进行了很好的讨论,这就解释了根本原因是2.6.38( http://redmine.ruby-lang.org/issues/4777 )
回归被修补了,看来这个补丁最近已经进入了Ubuntu的更新,所以如果你受到这个问题的影响,你应该应用最新的更新。
在Mac OS X上,这也发生在我身上。
令人惊讶的是, Rack
或WEBrick
都没有设置自定义信号处理程序。 我把它放在机架应用的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
这是很好的。 您可能还想为TERM
和HUP
添加处理程序。
使用这一行来创建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。