工头只显示"以pid#开头"的行,而没有别的

ijv*_*rig 53 ruby rubygems ruby-on-rails heroku foreman

当我管理工头时,我得到以下内容:

 > foreman start
 16:47:56 web.1     | started with pid 27122
Run Code Online (Sandbox Code Playgroud)

只有当我停止它(通过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 ...
Run Code Online (Sandbox Code Playgroud)

我如何解决它?

ijv*_*rig 49

我已经能够通过两种不同的方式解决这个问题:

  1. 来自https://github.com/ddollar/foreman/wiki/Missing-Output:

    如果您没有看到程序的任何输出,则很可能它正在缓冲标准输出.Ruby默认情况下缓冲stdout.要禁用此行为,请尽早在程序中添加此代码:

    # ruby
    $stdout.sync = true
    
    Run Code Online (Sandbox Code Playgroud)
  2. 通过heroku toolbelt包安装工头

但我仍然不知道发生了什么,也不知道为什么上述两种方式解决了这个问题......

  • +1 - 非常感谢!在下面的@Earle Clubb中,我将`$ stdout.sync = true`行添加到我的`config/environments/development.rb`文件中,它完美无缺! (5认同)
  • 现在只有1个有效.当Heroku Toolbelt有老版本的工头时,可能是第二次使用. (2认同)

小智 21

我的解决方案是放在$stdout.sync = trueconfig/environments/development.rb的顶部.

然后加载开发环境(包括thin)的所有内容都不会缓冲stdout.


jul*_*onc 15

"Foreman将向终端输出显示由其启动的进程写入stdout的任何内容." - ddollar见工头问题#57

顺便说一句,你可以使用tailf进入Procfile来查看日志

web: bundle exec rails server thin -p $PORT
log: tail -f log/development.log
Run Code Online (Sandbox Code Playgroud)

提示:在OSX中不存在tailf,使用tail -f -n 40 log/development.log工作.

  • Rails**仅**在下一个机架请求完成时刷新对日志文件的写入,它由Rails :: Rack :: Logger中间件处理.你在说哪个工人?Resque redis? (2认同)

小智 5

我也有同样的问题,但有不同的解决方案。(红宝石 1.9.2p290,导轨 3.1.0,ubuntu 10.04.3)

我将 Procfile 中的行从:

web: bundle exec thin start -p $PORT
Run Code Online (Sandbox Code Playgroud)

到:

web: bundle exec rails server thin -p $PORT
Run Code Online (Sandbox Code Playgroud)

它不再给我带来问题。


jse*_*ars 5

如果您使用Foreman运行Python项目而不是Ryby项目,并且您遇到了同样的问题,那么这里有一些解决方案.如果您使用Procfile直接调用python CLI,那么您可以使用'-u'选项来避免stdout缓冲:

python -u script.py
Run Code Online (Sandbox Code Playgroud)

如果您使用Procfile来管理WSGI服务器,例如调用gunicorn,flask,bottle,eve等,那么您可以将".env"文件添加到python项目的根目录,其中包含以下内容:

PYTHONUNBUFFERED=True
Run Code Online (Sandbox Code Playgroud)