【问题标题】:Why does Foreman exit when I add a rake assets:precompile task to my Procfile?当我将 rake assets:precompile 任务添加到我的 Procfile 时,为什么 Foreman 会退出?
【发布时间】:2016-02-19 07:01:10
【问题描述】:

我的 Ruby on Rails 应用程序使用工头 (https://github.com/ddollar/foreman) 来管理应用程序运行时需要启动的进程。

我的Procfile 看起来像这样:

precompile: bundle exec rake assets:precompile
web: bundle exec puma -e $PUMA_ENV
worker: bundle exec rake jobs:work
search: bundle exec rake sunspot:solr:run

运行 $ foreman start 按预期工作,直到我添加第一行(precompile 任务)。

当我运行 $ foreman start 时,我的输出如下所示:

$ foreman start -e .env.dev
10:30:20 precompile.1 | started with pid 7309
10:30:20 web.1        | started with pid 7310
10:30:20 worker.1     | started with pid 7311
10:30:20 search.1     | started with pid 7312
10:30:22 web.1        | [7310] Puma starting in cluster mode...
10:30:22 web.1        | [7310] * Version 2.8.2 (ruby 2.1.0-p0), codename: Sir Edmund Percival Hillary
10:30:22 web.1        | [7310] * Min threads: 4, max threads: 16
10:30:22 web.1        | [7310] * Environment: development
10:30:22 web.1        | [7310] * Process workers: 2
10:30:22 web.1        | [7310] * Phased restart available
10:30:22 web.1        | [7310] * Listening on tcp://0.0.0.0:3000
10:30:22 web.1        | [7310] Use Ctrl-C to stop
10:30:23 web.1        | [7313] + Gemfile in context: /Users/username/rails_projects/lcms/Gemfile
10:30:23 web.1        | [7314] + Gemfile in context: /Users/username/rails_projects/lcms/Gemfile
10:30:30 web.1        | [7310] - Worker 1 (pid: 7314) booted, phase: 0
10:30:30 worker.1     | [Worker(host:MacBook-Pro.local pid:7311)] Starting job worker
10:30:30 web.1        | [7310] - Worker 0 (pid: 7313) booted, phase: 0
10:30:32 precompile.1 | exited with code 0
10:30:32 system       | sending SIGTERM to all processes
SIGTERM received
10:30:32 web.1        | [7310] - Gracefully shutting down workers...
10:30:32 worker.1     | [Worker(host:MacBook-Pro.local pid:7311)] Exiting...
10:30:32 search.1     | exited with code 143
10:30:32 web.1        | [7310] - Goodbye!
10:30:32 web.1        | exited with code 0
10:30:33 worker.1     | exited with code 0

我不知道如何获得有关该问题的更多详细信息。我已经将$stdout.sync = true添加到我的config/environments/development.rb中,输出和没有的一样。

我还尝试将RAILS_ENV=developmentRAILS_ENV=production 附加和前置到预编译任务中。

如何让我的工头/Procfile 设置成功地预编译资产,然后继续启动应用程序的其他任务?

【问题讨论】:

  • 我怀疑10:30:32 precompile.1 | exited with code 0rake assets:precompile任务的结束,0的退出码告诉工头杀死所有进程。我不确定如何覆盖它,如果我这样做了,我不知道这是否明智。

标签: ruby-on-rails-4 rake foreman


【解决方案1】:

尝试在第一行之后的每个进程中添加sleep

web: sleep 1; bundle exec puma -e $PUMA_ENV
worker: sleep 1; bundle exec rake jobs:work
search: sleep 1; bundle exec rake sunspot:solr:run

如果有效,将sleep 1;一一删除,看看是什么原因造成的。

【讨论】:

    【解决方案2】:

    我决定我最好的选择是在启动 Puma 之前使用一种语法来执行我的 rake assets 任务,并且只有在预编译成功的情况下。

    因此,按顺序运行命令并在它们之间添加&& 似乎可以达到我想要的结果

    web: bundle exec rake assets:clean RAILS_ENV=$FOREMAN_ENV && bundle exec rake assets:precompile RAILS_ENV=$FOREMAN_ENV && bundle exec puma -e $FOREMAN_ENV
    worker: bundle exec rake jobs:work
    search: bundle exec rake sunspot:solr:run
    

    【讨论】:

    • 为了清楚起见,我希望将这些命令中的每一个都放在单独的行上。如果其他人也选择在 Rails 中使用 foreman 并在启动时预编译资产,那么请分享您管理此过程的解决方案。
    【解决方案3】:

    问题在于,一旦 foreman 中的一个进程存在,所有进程都会存在。我认为这是有意义的设计。应用程序是运行服务的组合。

    如果你想运行一次性任务,你可以使用 foreman run。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-14
      • 2017-06-19
      • 2019-11-25
      • 2019-07-25
      • 1970-01-01
      • 2021-08-10
      • 2013-05-12
      相关资源
      最近更新 更多