【问题标题】:How to Daemonize a Rails script with bluepill如何使用 bluepill 守护 Rails 脚本
【发布时间】:2013-09-22 13:10:31
【问题描述】:

我一直成功地使用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 Daemons 来让它工作,但这并不能做监控,而 bluepill 能够很好地做到这两点。

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

【问题讨论】:

  • 你是否在 lib/async/myscript.rb 中守护进程?
  • 感谢您的赏金,但您让它运行了吗?

标签: ruby-on-rails ruby daemon bluepill


【解决方案1】:

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

由于该进程不再存在,因此 ruby​​ 在加载环境时可能会死机。

你没有展示你的剧本。我猜它从命令行运行正常,但无法守护进程。一个可能的解释是,您的 shell 环境中有一些东西在 Bluepill 进程中丢失了。另一种可能性是访问交互式 shell 拥有的资源,但无头守护进程没有。

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

【讨论】:

    【解决方案2】:

    在这个网站https://github.com/arya/bluepill/issues/164我找到了这个信息

    经过一些实验,我发现如果您使用 --no-privileged 标志以及基本目录和日志文件标志运行命令,它就可以工作。它们也包含在配置中,所以有点多余:/

    命令示例:bundle exec bluepill load bluepill/monitorbs.pill --no-privileged --base-dir /xxx/xxx/xxx --logfile /xxx/xxx/xxx/bluepill/bs.log"

    【讨论】:

      【解决方案3】:

      嗯。我们尝试了 bluepill 一段时间,但在流程启动复杂的许多情况下,它并没有帮助。我们最近对“runit”感到更满意,它有许多非常有用的随附组件(例如用于设置用户、环境等的 chpset)。我们现在正在使用像 chef 这样的 devops 工具来设置具有标准服务的机器,而 runit 更适合。但是对于其中任何一个,您都需要您关心的正在运行的进程的 pid,以便能够接收来自监控系统的信号 - 这听起来像是您从 start 命令获得的 PID:

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

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

      【讨论】:

        【解决方案4】:

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

        我对 bluepill 的运气并不好,我在眼睛方面取得了更大的成功: https://github.com/kostya/eye

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-10-04
          • 1970-01-01
          • 1970-01-01
          • 2011-09-07
          • 1970-01-01
          • 2010-10-06
          • 1970-01-01
          • 2015-07-05
          相关资源
          最近更新 更多