如何使用bluepill对Rails脚本进行Daemonize

时间:2013-09-17 22:33:40

标签: ruby-on-rails ruby daemon bluepill

我总是成功地使用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 个答案:

答案 0 :(得分:4)

信号代码0到kill查询以确定守护程序是否接受信号。 Bluepill源代码显示这是在产生后经常完成的,以检查守护进程是否还活着。

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

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

这是一个猜测:对于你给予工作的require,我相信必须设置RAILS_ENV环境变量。你在做吗?请参阅示例this note。也许最好使用启动脚本加载。请参阅for example the Rails initialization description

答案 1 :(得分:3)

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

我对bluepill没有太多运气,我用眼睛取得了更大的成功: https://github.com/kostya/eye

您可能需要检查它,它具有与bluepill相同的语法。

答案 2 :(得分:2)

嗯。我们尝试了一段时间的bluepill,但是在很多情况下,进程都有复杂的初创公司。我们最近对'runit'感到高兴,它有许多附带的组件(例如用于设置用户,环境等的chpset)非常有用。我们正在使用像厨师这样的devops工具来设置具有标准服务的机器,而runit更适合。但是对于其中任何一个,你需要你关心的运行过程的pid能够从监控系统接收信号 - 这听起来就像你从启动命令获得的PID:

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

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

答案 3 :(得分:0)

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

  

经过一些实验后,我发现如果你运行带有--no-privileged标志的命令以及base dir和logfile标志就可以了。它们也包含在配置中,因此它有点多余:/

     

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