如何使用bluepill守护Rails脚本

问题描述 投票:4回答:4

我一直成功使用bluepill来守护简单的Ruby脚本。但是这次,我有一个脚本也正在加载Rails环境,因此我可以访问Rails应用程序及其各自模型的数据库连接。我使用的bluepill配置与我通常所做的没什么不同:

   Bluepill.application("myapp", :foreground => true, :log_file => "/tmp/bluepill.log") do |app|
          app.process("myapp_process") do |process|
            process.start_command = "/usr/local/rvm/rubies/ruby-1.9.3-p194/bin/ruby /media/apps/myapp/current/lib/async/myscript.rb"
            process.pid_file = "/media/apps/myapp/current/tmp/pids/myscript.pid"
            process.daemonize = true
            process.stdout = "/var/log/myapp/media.log"
            process.stderr = "/var/log/myapp/media_error.log"
            process.working_dir = "/tmp"
            process.stop_command = "kill -QUIT {{PID}}"
            process.start_grace_time = 15.seconds
          end
    end

主要问题是此错误:

Failed to signal process 16096 with code 0: No such process

如果我不使用此方法加载Rails环境:

require File.expand_path("/media/apps/myapp/current/config/environment")

这将与其他许多脚本一样工作。但是,这是我第一次尝试守护加载Rails环境的脚本。我知道我可以使用ruby gem守护程序来使它正常工作,但这并不能进行监视,bluepill能够很好地完成这两项工作。

我在这里遗漏了明显的东西吗?

ruby-on-rails ruby daemon bluepill
4个回答
4
投票

信号代码0至kill进行查询以确定守护程序是否接受信号。 Bluepill源显示了在生成之后经常执行此操作,以检查守护进程是否正常运行。

由于该过程不再存在,因此在加载环境时,红宝石可能正在死亡。

您没有显示脚本。我猜想它可以从命令行正常运行,但是无法守护。一个可能的解释是,Bluepill进程的外壳环境中缺少某些内容。另一种可能性是访问交互式外壳程序具有的资源,但无头守护进程没有。

这里有一个猜测:对于您要使用的require,我相信必须设置RAILS_ENV环境变量。你在那样吗参见例如this note。使用引导脚本进行加载也许更好。参见for example the Rails initialization description


3
投票

[您知道您也可以在rails runner的Rails环境中运行脚本吗?您可能想要尝试一下。

我对Bluepill运气不太好,在眼睛方面我获得了很多成功:https://github.com/kostya/eye

您可能想要检查一下,它的语法与bluepill相同。


2
投票

嗯。我们尝试了bluepill一段时间,但在流程具有复杂启动的许多情况下没有帮助。最近,我们对'runit'感到更加满意,其中包含许多非常有用的附带组件(例如用于设置用户,环境等的chpset)。我们现在正在使用厨师之类的devops工具来设置具有标准服务的机器,而runit更适合。但是,无论使用哪种方法,都需要您关心的运行过程的pid,以便能够从监视系统接收信号-听起来像是您从启动命令中获得的PID:

/ media / apps / myapp / current / lib / async / myscript.rb

不是一直运行的那个-也许如果您发布更多该脚本,我们可以看到正在发生的事情,但是我猜它正在某个分支中启动另一个进程?


0
投票

在此站点上https://github.com/arya/bluepill/issues/164我找到了此信息

经过一些实验,我发现如果您运行带有--no-privileged标志以及基本dir和logfile标志的命令,它将起作用。它们也包含在配置中,因此有点多余:/

命令示例:bundle exec bluepill load bluepill / monitorbs.pill-无特权--base-dir / xxx / xxx / xxx --logfile /xxx/xxx/xxx/bluepill/bs.log“

© www.soinside.com 2019 - 2024. All rights reserved.