工头只显示“以 pid # 开头”的行,没有别的
Posted
技术标签:
【中文标题】工头只显示“以 pid # 开头”的行,没有别的【英文标题】:foreman only shows line with “started with pid #” and nothing else 【发布时间】:2012-02-01 18:48:38 【问题描述】:当我运行工头时,我得到以下信息:
> foreman start
16:47:56 web.1 | started with pid 27122
只有当我停止它(通过 ctrl-c)时,它才会向我显示缺少的内容:
^CSIGINT received
16:49:26 system | sending SIGTERM to all processes
16:49:26 web.1 | => Booting Thin
16:49:26 web.1 | => Rails 3.0.0 application starting in development on http://0.0.0.0:5000
16:49:26 web.1 | => Call with -d to detach
16:49:26 web.1 | => Ctrl-C to shutdown server
16:49:26 web.1 | >> Thin web server (v1.3.1 codename Triple Espresso)
16:49:26 web.1 | >> Maximum connections set to 1024
16:49:26 web.1 | >> Listening on 0.0.0.0:5000, CTRL+C to stop
16:49:26 web.1 | >> Stopping ...
16:49:26 web.1 | Exiting
16:49:26 web.1 | >> Stopping ...
我该如何解决?
【问题讨论】:
如果您要启动需要整个 Rails 堆栈的多个任务,则启动所有内容可能需要一段时间。工头输出是即时的,但您的后台工作不会比平时更快。就我而言,我不得不等待大约 2 分钟。所以……等等吧。 【参考方案1】:如果您使用 Foreman 来运行 Python 项目,而不是 Ryby 项目,并且您遇到了同样的问题,这里有一些适合您的解决方案。如果您使用 Procfile 直接调用 python CLI,那么您可以使用“-u”选项来避免标准输出缓冲:
python -u script.py
如果你使用Procfile来管理一个WSGI服务器,比如调用gunicorn、flask、bottle、eve等,那么你可以在你的python项目的根目录下添加一个“.env”文件,包含以下内容:
PYTHONUNBUFFERED=True
【讨论】:
问题明确是关于 Ruby 和 Ruby on Rails,而不是 Python【参考方案2】:我的解决方案是将$stdout.sync = true
放在 config/environments/development.rb 的顶部。
那么加载开发环境的所有东西(包括thin)都不会缓冲stdout。
【讨论】:
【参考方案3】:我已经能够通过 2 种不同的方式解决此问题:
来自https://github.com/ddollar/foreman/wiki/Missing-Output:
如果您没有看到程序的任何输出,则可能是 它正在缓冲标准输出的机会。 Ruby 默认缓冲标准输出。到 禁用此行为,请尽早将此代码添加到您的 程序:
# ruby
$stdout.sync = true
通过heroku toolbelt package安装工头
但我仍然不知道发生了什么,也不知道为什么上述两种方法解决了问题......
【讨论】:
+1 - 非常感谢!根据下面的@Earle Clubb,我将$stdout.sync = true
行添加到我的config/environments/development.rb
文件中,它运行良好!
现在只有 1 有效。当 Heroku Toolbelt 有旧版本的工头时,可能会第二次使用。【参考方案4】:
“Foreman 将向终端输出显示它启动的进程写入标准输出的任何内容。” - ddollar 见foreman-issues#57
顺便说一句,你可以在 Procfile 中使用 tailf 来查看日志
web: bundle exec rails server thin -p $PORT
log: tail -f log/development.log
提示:tailf 在 OSX 中不存在,使用 tail -f -n 40 log/development.log 有效。
【讨论】:
这具有相同的目的,但并没有改变 rails 出于某种原因仍然没有为我刷新缓冲区。当我运行“rails 控制台”并运行 STDOUT.sync 时,它返回 true,因此它应该正在刷新,但工头仍然没有从工人那里写任何东西。 Rails only 在下一个机架请求完成时刷新写入日志文件,由 Rails::Rack::Logger 中间件处理。你说的是哪个工人? Resque redis ? 对不起,工人我的意思是 tail -f 正在运行。不知道为什么,但我肯定有一个开发环境,其中 web 正在编写我目前通过日志看到的所有消息。【参考方案5】:我也有同样的问题,但有不同的解决方案。 (ruby 1.9.2p290,rails 3.1.0,ubuntu 10.04.3)
我将我的 Procfile 中的行更改为:
web: bundle exec thin start -p $PORT
到:
web: bundle exec rails server thin -p $PORT
它不再给我带来问题。
【讨论】:
不。没用。在 webrick 上显示一些 INFO 消息,但它仍然只显示 ctrl-c 后的引导消息... 这个对我有用。我用bundle exec puma ...
和rails s ...
启动了服务器【参考方案6】:
我有同样的问题(ruby 1.9.3-p0,rails 3.2rc2,OSX 10.7)。
通过将此行添加到我的 Gemfile 中,使用 foreman-0.27.0 解决了该问题。
gem 'foreman', '0.27.0'
【讨论】:
当我安装了 heroku toolbelt 包中的“更通用的工头”时,我的工作正常。gems 中的那个没有……以上是关于工头只显示“以 pid # 开头”的行,没有别的的主要内容,如果未能解决你的问题,请参考以下文章
运行“工头启动”/将 Django 应用程序部署到 Heroku 时出现问题