工头只显示“以 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 时出现问题

我的手机里的微信视频打开,只有声音,没有图像,显示黑屏,但看别的不是微信里的视频都是正常,声音图像

如何在 2 个 repo 之间使用工头?

阔太吴佩慈花式炫富 变包工头巡视自家“皇宫

ubuntu ifconfig只有lo没有别的网络的问题