我正在使用RVM,Ruby 1.9.2和Rails 3.0.7
从另一个终端对进程进行标准终止也不起作用,但 kill -9 当然可以。
我发现了一个类似的问题,CTRL + C到Webbrick服务器被忽略了,但目前还不清楚这个问题是否描述了相同的潜在问题。 此外,该分辨率似乎不适用,因为我没有在我的 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 到 Webbrick 服务器被忽略有关,尽管上面的测试用例表明这个问题显然不是由使用 :git 作为 gem 引起的。
更新 2:
在更新 1 中,我提到我将其缩小到宝石。 当我穿过那颗宝石时,我最终找到了真正的罪魁祸首。 Gem 正在进行单个系统调用。 我对测试脚本进行了非常小的修改,不再加载咖啡师 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 之间的相似之处。 我的预感是,他们提到的宝石也会进行系统调用。
我宁愿发表评论也不愿为此添加答案,但没有足够的代表。
我有同样的问题,发现在键入 ctrl-c 然后暂停(如上所述使用ctrl-z)后恢复(使用 fg
)可以解决问题。
所以食谱是:
- Ctrl-C(立即不执行任何操作)
- ctrl-z (暂停 WEBrick,回到 shell)
-
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, then 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')
我怀疑 Ruby 的select
中发生了什么东西,正在捕获信号。
以下是停止服务器的 2 种方法:
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
,这些都很好。您可能还希望为TERM
和HUP
添加处理程序。
使用此行使用 ccsm(compiz conig Settings Manager 或像这样的 smth)创建快捷方式 ->命令:
kill -9 `pgrep -fl 'script/rails s' | awk '{print $1}'`
设置为 (Ctrl+Shift+') 或您喜欢的任何内容
更新 Ubuntu 时遇到了同样的问题。使用Ctrl + C无法正常退出webrick,不得不使用kill -9
...
我自己也遇到了这个问题。 我正在使用 rvm rails 3.0.9 和 ubuntu 11.04 32 位运行 unity。 我发现终结者会将 Ctrl+c 传递给轨道。
似乎是 Unity 和终端的问题 由于某种原因,^c 未正确处理。 尝试使用terminator
(更好的终端)做同样的事情。或者只是使用侏儒。
至少这就是我解决问题的方式。我建议我们把它移到 askubuntu.com。
在 U10.04 中,我在运行 webrick、mongrel、console、sqlite 时遇到了这个问题,我实际运行什么并不重要。
我的最后一个答案被删除了不知道为什么,但我再试一次,因为我真的认为这与问题非常相关。
在我的 Gemfile 中,我只有一个 gem 使用参数 :git。
gem 'rails_admin', :git => 'git://github.com/sferik/rails_admin.git'
我有同样的问题,ctrl + C被忽略; 但是如果我删除这个gem依赖项,(并且我删除了相关的初始值设定项),问题就消失了,我可以像以前一样使用ctrl + c。
我可以认为这是一个与rails_admin宝石相关的错误,但正如我在另一个问题中读到的那样: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
如果 ctr+c 不工作,然后在实现上述方法之前,只需查看您的终端设置即可。有时我们可能会为了方便而更改终端的快捷键。我们分配 ctr+c 用于复制终端的内容。在这种情况下,ctr+c 将不适用于停止服务器,而是用作复制目的。
如果未更改设置,请尝试使用其他端口,如 4000。