首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用bluepill守护Rails脚本

如何使用bluepill守护Rails脚本
EN

Stack Overflow用户
提问于 2013-09-18 06:33:40
回答 4查看 1.7K关注 0票数 4

我一直成功地使用bluepill来守护简单的Ruby脚本。然而,这一次,我有一个脚本,它也加载了一个Rails环境,这样我就可以访问Rails应用程序及其相应模型的数据库连接。我使用的bluepill配置与我通常使用的没有什么不同:

代码语言:javascript
复制
   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

主要问题是这个错误:

代码语言:javascript
复制
Failed to signal process 16096 with code 0: No such process

如果我不使用以下命令加载Rails环境:

代码语言:javascript
复制
require File.expand_path("/media/apps/myapp/current/config/environment")

这将与我的一堆其他脚本一样工作。然而,这是我第一次尝试守护加载Rails环境的脚本。我知道我可以使用ruby gem Daemons来让它工作,但是那样做不能进行监控,并且bluepill能够很好地完成这两个任务。

我是不是漏掉了什么明显的东西?

EN

回答 4

Stack Overflow用户

发布于 2013-09-27 10:02:31

kill查询信号代码0,以确定守护进程是否接受信号。Bluepill源代码显示,在派生后经常会执行此操作,以检查守护进程是否处于活动状态且运行良好。

因为这个进程已经不存在了,所以ruby在加载环境的时候很可能会死掉。

你没有展示你的剧本。我猜它可以从命令行运行,但不能守护进程。一种可能的解释是,您的shell环境中有Bluepill进程所缺少的内容。另一种可能是访问您的交互式shell拥有的资源,但无头守护进程没有。

这里有一个猜测:对于您提供的require,我认为必须设置RAILS_ENV环境变量。你要这么做吗?有关示例this note,请参阅。也许使用引导脚本加载会更好。参见for example the Rails initialization description

票数 4
EN

Stack Overflow用户

发布于 2013-09-18 06:51:33

你知道你也可以用rails runner在rails环境中运行脚本吗?你可能会想试一下。

我用bluepill不太走运,我用eye成功了很多:https://github.com/kostya/eye

你可能想检查一下,它和bluepill有相同的语法。

票数 3
EN

Stack Overflow用户

发布于 2013-09-21 04:44:08

嗯。我们尝试过一段时间的bluepill,但在许多流程启动复杂的情况下,它并没有什么帮助。我们最近更喜欢'runit‘,它有许多附带的组件(例如设置用户、环境等的chpset ),这些组件非常有用。我们现在正在使用像chef这样的devops工具来设置具有标准服务的机器,而runit是更好的选择。但是对于其中的任何一个,您都需要您所关心的正在运行的进程的pid才能接收来自监控系统的信号-它听起来就像您从start命令中获得的PID:

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

不是一直在运行的那个--也许如果你发布更多的脚本,我们可以看到发生了什么,但我猜它在某个地方分叉了另一个进程?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18860985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档