33

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

从另一个终端对进程的标准终止也不起作用,但是 kill -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 到 Webbrick 服务器被忽略有关,尽管上面的测试用例表明这个问题显然不是由使用引起的: git 的宝石。

更新2:

更新 1中,我提到我将其缩小为宝石。当我穿过那颗宝石时,我最终找到了真正的罪魁祸首。gem 进行了一次系统调用。我对测试脚本进行了非常小的修改,不再加载 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 server ignored之间的相似之处。我的预感是他们提到的 gem 也会进行系统调用。

4

13 回答 13

18

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

我有同样的问题,发现fg输入后恢复 (with ) ctrl-c然后暂停 (with 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
    
于 2011-05-14T18:33:52.877 回答
8

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

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

于 2011-05-05T01:22:13.203 回答
6

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

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

回归已被修补,并且看起来该修补程序最近已进入 Ubuntu 的更新,因此如果您受到此问题的影响,您应该应用最新的更新。

于 2011-07-20T21:49:01.857 回答
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,因此如果您通过 rack 启动 WEBrick,您可能希望省略-Dor--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等)生成的信号即使已在该终端上启动也无法到达该进程。链接已被切断。

于 2011-05-05T01:52:31.160 回答
4

这也发生在我的 Mac OS X 上。

令人惊讶的是,既没有也没有Rack设置WEBrick自定义信号处理程序。我把它放在我的机架应用程序的call方法中,它告诉我DEFAULTSIGINT 的处理程序是当前的处理程序(返回 String "DEFAULT"):

p Signal.trap('INT', 'DEFAULT')

我怀疑 ruby​​ 中发生了一些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经常使用,这些都很好。您可能还想为TERMand添加处理程序HUP

于 2012-11-13T23:50:17.767 回答
1

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

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

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

于 2011-07-05T13:56:18.193 回答
1

我在更新我的 Ubuntu 时遇到了同样的问题。Ctrl使用+无法正常退出 webrick C,必须使用kill -9...

于 2011-05-24T10:02:19.573 回答
1

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

于 2011-06-17T23:16:27.713 回答
0

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

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

rails s

那里。Ctrl+C可重复地为我工作并停止服务器。

希望我能帮上忙!:)

编辑:显然这对每个人来说都无法重现,这是我的设置:Ubuntu 11.04, 32-bit, Guake 0.4.2-4ubuntu1

于 2011-06-02T18:08:52.753 回答
0

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

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

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

大家都有同样的问题,ctrl+C被忽略了;但是如果我删除这个 gem 依赖项,(并且我删除了 de 相关的初始化程序)问题就消失了,我可以像以前一样使用 ctrl+c。

我可能认为这是一个与 rails_admin gem 相关的错误,但正如我在另一个问题中所读到的那样: CTRL+C to Webbrick 服务器忽略 了它更有可能与使用 :git 参数的任何 gem 相关......

希望它有帮助。

于 2011-07-04T18:10:16.657 回答
0

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

stty -echoctl

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

只工作了一个会话。附近发布了更好的解决方案。

于 2011-07-05T06:06:09.897 回答
0

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

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

在 U10.04 中,我在运行 webrick、mongrel、console、sqlite 时遇到了这个问题,我实际运行什么并不重要。

于 2011-05-24T20:05:03.943 回答
0

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

如果设置没有更改,请尝试使用另一个端口,例如 4000。

于 2017-01-04T18:06:44.833 回答