我一直成功使用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能够很好地完成这两项工作。
我在这里遗漏了明显的东西吗?
信号代码0至kill
进行查询以确定守护程序是否接受信号。 Bluepill源显示了在生成之后经常执行此操作,以检查守护进程是否正常运行。
由于该过程不再存在,因此在加载环境时,红宝石可能正在死亡。
您没有显示脚本。我猜想它可以从命令行正常运行,但是无法守护。一个可能的解释是,Bluepill进程的外壳环境中缺少某些内容。另一种可能性是访问交互式外壳程序具有的资源,但无头守护进程没有。
这里有一个猜测:对于您要使用的require
,我相信必须设置RAILS_ENV
环境变量。你在那样吗参见例如this note。使用引导脚本进行加载也许更好。参见for example the Rails initialization description。
[您知道您也可以在rails runner
的Rails环境中运行脚本吗?您可能想要尝试一下。
我对Bluepill运气不太好,在眼睛方面我获得了很多成功:https://github.com/kostya/eye
您可能想要检查一下,它的语法与bluepill相同。
嗯。我们尝试了bluepill一段时间,但在流程具有复杂启动的许多情况下没有帮助。最近,我们对'runit'感到更加满意,其中包含许多非常有用的附带组件(例如用于设置用户,环境等的chpset)。我们现在正在使用厨师之类的devops工具来设置具有标准服务的机器,而runit更适合。但是,无论使用哪种方法,都需要您关心的运行过程的pid,以便能够从监视系统接收信号-听起来像是您从启动命令中获得的PID:
/ media / apps / myapp / current / lib / async / myscript.rb
不是一直运行的那个-也许如果您发布更多该脚本,我们可以看到正在发生的事情,但是我猜它正在某个分支中启动另一个进程?
在此站点上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“