如何使用 upstart 启动 rake 任务

如何使用 upstart 启动 rake 任务

我正在尝试将 Resque 工作器设置为 Upstart 初始化脚本,供 Monit 在 Rails 应用中使用。我不是系统操作员,我尝试使用我们服务器上的其他初始化脚本中的示例来编写此脚本,以下是我得到的结果:

start on startup
stop on shutdown

pre-start script
   cd /var/www/my-app/current
end script

script
   exec bundle exec rake environment resque:work RAILS_ENV=staging PIDFILE=/var/run/resque.pid QUEUE=sync >> /var/log/resque.log
end script

但它不起作用,如果我尝试,sudo start resque我会得到:

resque start/running, process XXXX

据我所知,什么都没有启动,找不到 Resque 进程,也没有日志文件。我完全不知道如何让它工作。

更新:我找到了系统日志文件,上面写着:

Nov  4 17:20:09 fantasysports init: resque main process (3057) terminated with status 2

更新:我尝试使用 sudo 运行它(是的,这没有意义!)并删除了到日志文件的输出重定向,现在我得到了不同的状态代码:

Nov  4 17:29:44 fantasysports init: resque main process (3276) terminated with status 10

更新:最终放弃了 Upstart,转而使用 init.d,因为它start-stop-daemon有更详细的文档,而且能让我完全控制正在发生的事情。

答案1

这是我的方法..这也添加了 rvm

start on startup
stop on starting rcS

chdir /data/pusher/current
env RAILS_ENV=production
script
  /usr/local/bin/rvm-shell '1.9.2@app' -c 'JOBS_PER_FORK=25 RAILS_ENV=production QUEUE=app_production bundle exec rake --trace resque:work >> /data/app/current/log/app-worker.production.log 2>&1'
end script

编辑:下面是我以不同用户身份运行时的操作方法。chdir 似乎不受尊重。所以这有点黑客行为

start on runlevel [2345]
stop on starting rcS

chdir /data/app/current
env RAILS_ENV=production
script
        sudo -u user -s -- "cd /data/app/current; export RAILS_ENV=production; /usr/local/bin/rvm-shell '1.9.2-p180@app' -c 'QUEUE=app_production bundle exec rake resque:work >> /data/app/current/log/app-worker.production.log 2>&1'"
end script

您几乎需要切换到正确的目录并在 sudo 命令中设置 RAILS_ENV

答案2

你可能想看看 Foreman:http://ddollar.github.com/foreman/它具有导出到 upstart 的功能,并且推荐用于管理多个岗位的 resque 工人,其中包括这个:http://michaelvanrooijen.com/articles/2011/06/08-managing-and-monitoring-your-ruby-application-with-foreman-and-upstart/

答案3

RVM 手册在“集成”部分推荐的方式是“使用通过 init.d 或 upstart 启动的 RVM 和基于 Ruby 的服务“是使用 RVM 别名和包装器。

我遇到过需要监控某个bluepill进程的情况。此进程是一个守护进程,因此该进程会分叉 2 次。使用命令启动它时rvm-shell添加了第三次分叉...这导致 Upstart 无法跟踪该进程PID它最多只能跟踪到第二个 fork 为止的进程 - 当给定expect daemon节时)。

我通过以下方式解决了这个问题:

  1. 首先我为我的环境创建了一个 RVM 别名:

    rvm alias create my_app ruby-2.0.0-p247@my_app

  2. 然后我在工作中使用了以下 upstart 配置:

`#/etc/init/bluepill_my-app.conf

description "my_app Bluepill"

start on runlevel [2]
stop on runlevel [016]

setuid my-app
setgid my-app

expect daemon
respawn

env USER=my-app
env HOME=/var/www/my-app/
env RAILS_ENV=my-app
env BLUEPILL_BASE_DIR=/tmp/bluepill_my-app

chdir /var/www/my-app/current/

exec /var/www/my-app/.rvm/wrappers/my-app/bundle exec bluepill --no-privileged load  /var/www/my-app/current/config/deploy/monitoring/my-app.pill >> /tmp/upstart.log 2>&1

`

Bundler 需要安装在 RVM 别名指向的给定 gemset 中。

调用bundler包装器脚本不会像rvm-shell命令那样导致任何分叉。

另一种方法是将bluepillgem 安装在所使用的 gemset 中,为其创建一个包装脚本并直接使用它而不使用 bundle exec - 就像 RVM 手册建议的那样 - 但是通过使用它bunlder允许 bluepill.pill文件使用 my-app 中使用的任何库(如setingslogic等)。

这有点偏离主题,但我认为这是一个很好的例子,可以说明如何做得更好。希望这对你有所帮助。

相关内容