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

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

4

4 回答 4

4

信号代码 0 用于kill查询以确定守护程序是否接受信号。Bluepill 源代码显示,这是在生成后经常执行的,以检查守护进程是否还活着并且运行良好。

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

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

这里有一个猜测:对于require你给的工作,我相信RAILS_ENV必须设置环境变量。你这样做吗?例如,请参阅此注释。也许使用引导脚本加载会更好。例如参见Rails 初始化描述。

于 2013-09-27T02:02:31.287 回答
3

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

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

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

于 2013-09-17T22:51:33.153 回答
2

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

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

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

于 2013-09-20T20:44:07.813 回答
0

在这个网站上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"

于 2013-09-27T12:53:05.627 回答