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,如上所述)可以解决问题.
所以食谱是:
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)我遇到了类似的问题,一直用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:
Run Code Online (Sandbox Code Playgroud)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)页:
Run Code Online (Sandbox Code Playgroud)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的更新,所以如果你受到这个问题的影响,你应该应用最新的更新.
| 归档时间: |
|
| 查看次数: |
7963 次 |
| 最近记录: |