【问题标题】:Cannot suspend webrick with control-Z after server processes a request服务器处理请求后无法使用 control-Z 挂起 webrick
【发布时间】:2014-10-28 22:39:18
【问题描述】:

在开发 Rails 4.1.6 项目时,我可以启动 Webrick 服务器:

rails s

在服务器处理任何请求之前,我可以:

  • 用 control-C 停止它
  • 用 control-Z 暂停它

服务器处理完请求后,我仍然可以使用 control-C 将其停止,但我无法再使用 control-Z 将其挂起。键入 control-Z 会向终端回显“^Z”,但服务器会继续运行并将处理它收到的任何请求。

为什么服务器处理完请求后,control-Z 无法挂起服务器?

详情

启动服务器:

$ rails s
Warning: NLS_LANG is not set. fallback to US7ASCII.
=> Booting WEBrick
=> Rails 4.1.6 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Notice: server is listening on all interfaces (0.0.0.0). Consider using 127.0.0.1 (--binding option)
=> Ctrl-C to shutdown server
[2014-10-28 15:16:09] INFO  WEBrick 1.3.1
[2014-10-28 15:16:09] INFO  ruby 2.1.2 (2014-05-08) [i686-linux]
[2014-10-28 15:16:09] INFO  WEBrick::HTTPServer#start: pid=29538 port=3000

在服务器处理任何请求之前的Control-Z:

$ rails s
Warning: NLS_LANG is not set. fallback to US7ASCII.
=> Booting WEBrick
=> Rails 4.1.6 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Notice: server is listening on all interfaces (0.0.0.0). Consider using 127.0.0.1 (--binding option)
=> Ctrl-C to shutdown server
^Z
[1]+  Stopped                 rails s

处理请求:

Started GET "/" for 127.0.0.1 at 2014-10-28 15:18:24 -0700
  ActiveRecord::SchemaMigration Load (4.2ms)  SELECT "SCHEMA_MIGRATIONS".* FROM "SCHEMA_MIGRATIONS"
   (69.1ms)  SELECT column_name AS name, data_type AS sql_type, data_default, nullable, virtual_column, hidden_column, data_type_owner AS sql_type_owner, DECODE(data_type, 'NUMBER', data_precision, 'FLOAT', data_precision, 'VARCHAR2', DECODE(char_used, 'C', char_length, data_length), 'RAW', DECODE(char_used, 'C', char_length, data_length), 'CHAR', DECODE(char_used, 'C', char_length, data_length), NULL) AS limit, DECODE(data_type, 'NUMBER', data_scale, NULL) AS scale FROM all_tab_cols WHERE owner = 'DOCUMENT_DIRECTOR_DEVELOPMENT' AND table_name = 'SCHEMA_MIGRATIONS' AND hidden_column = 'NO' ORDER BY column_id
Processing by IndexController#index as JSON
  Rendered index/index.json.jbuilder (3.1ms)
Completed 200 OK in 10ms (Views: 9.9ms | ActiveRecord: 0.0ms)

Control-Z 处理请求后,按了很多次,因为我的意思是业务:

^Z^Z^Z^Z^Z^Z

宝石文件:

source 'https://rubygems.org'
source 'http://gems:9292'

gem 'activerecord-oracle_enhanced-adapter',
  git: 'https://github.com/wconrad/oracle-enhanced.git',
  branch: 'better-system-password-entry'
gem 'apipie-rails'
gem 'capistrano-rails', group: :development
gem 'capistrano-rvm'
gem 'cucumber-rails', :require => false, group: [:test]
gem 'cute_print'
gem 'database_cleaner', group: [:development, :test]
gem 'factory_girl_rails', group: [:development, :test]
gem 'jbuilder'
gem 'jsonpath', group: :test
gem 'maruku'
gem 'newrelic_rpm'
gem 'opacs_billing'
gem 'opacs_db'
gem 'rails'
gem 'rails-erd', group: :development
gem 'retryable'
gem 'rspec-rails', group: [:development, :test]
gem 'ruby-oci8'
gem 'sass-rails'
gem 'sdoc', group: :doc
gem 'simplecov', require: false, group: :test
gem 'spring', group: :development
gem 'versionist'
gem 'yard'

版本:

  • MRI 2.1.2
  • Rails 4.1.6
  • bash 4.2.37
  • Debian GNU/Linux “喘不过气来”

【问题讨论】:

  • 您想要的只是 Control-Z 在处理完请求时暂停进程?
  • @User089247 没错。用例是:control-Z,然后“bg”在后台恢复服务器,然后tail一个日志。
  • 那么为什么不将进程本身作为守护进程运行呢? rails s -d 然后tail -f log/development.log
  • @User089247 因为“rails s”很容易,然后让 rails 在控制台上登录而不需要单独的命令。
  • 韦恩,没有: 1 dup ; DAY + swap; DOLLAR + ;

标签: ruby-on-rails ruby-on-rails-4 signals webrick


【解决方案1】:

在您在问题评论部分写的其中一个 cmets 中,您说:

用例是:control-Z,然后“bg”在后台恢复服务器,然后tail一个日志。

我认为问题在于将服务器置于后台而不是前台(使用命令fg)。如果您将服务器置于后台,控制台将无法再将其停止,除非您将其置于前台,因此 CTRL-Z 将不起作用。所以,我会尝试以下顺序:

  1. rails s
  2. CONTROL-Z(程序暂停)
  3. fg(程序恢复)
  4. CONTROL-Z(程序是否再次停止?)

如果您想继续将您的服务器置于后台,那么您可以向它发送 STOP 信号,而不是通过键入 CONTROL-Z,而是通过使用 kill 发送信号:

kill -STOP <SERVER_PID> 

kill -s STOP <SERVER_PID>

(取决于您的系统)。

恢复进程:

kill -CONT <SERVER_PID>

kill -s CONT <SERVER_PID>

【讨论】:

  • 感谢您对这个问题的关注。谢谢! rails 服务器通常不会(曾经?)从控制台读取数据,因此在等待输入时,它不会导致它暂停。上述序列的第 2 步是失败的。使用“kill -s STOP...”确实有效。
  • 我用了不好的词...当我说“从控制台读取”时,我指的是控制台在按下 CONTROL-Z 时发送 STOP 信号的能力。换句话说,CONTROL-Z 告诉控制台向 FOREGROUND 进程发送 STOP 信号(后台进程不受影响,应该不会!)。我刚刚编辑了答案。
  • 麻烦的是control-Z、bg、fg,都正常工作直到服务器处理一个请求。服务器处理请求后,就好像控制台上的 control-Z 没有向服务器发送 STOP 信号。
  • 好的,我明白了。所以即使 Webrick 之前从未暂停过,如果它收到一个请求,它也无法处理它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多