我一直成功地使用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能够很好地完成这两个任务。
我是不是漏掉了什么明显的东西?
发布于 2013-09-27 10:02:31
向kill查询信号代码0,以确定守护进程是否接受信号。Bluepill源代码显示,在派生后经常会执行此操作,以检查守护进程是否处于活动状态且运行良好。
因为这个进程已经不存在了,所以ruby在加载环境的时候很可能会死掉。
你没有展示你的剧本。我猜它可以从命令行运行,但不能守护进程。一种可能的解释是,您的shell环境中有Bluepill进程所缺少的内容。另一种可能是访问您的交互式shell拥有的资源,但无头守护进程没有。
这里有一个猜测:对于您提供的require,我认为必须设置RAILS_ENV环境变量。你要这么做吗?有关示例this note,请参阅。也许使用引导脚本加载会更好。参见for example the Rails initialization description。
发布于 2013-09-18 06:51:33
你知道你也可以用rails runner在rails环境中运行脚本吗?你可能会想试一下。
我用bluepill不太走运,我用eye成功了很多:https://github.com/kostya/eye
你可能想检查一下,它和bluepill有相同的语法。
发布于 2013-09-21 04:44:08
嗯。我们尝试过一段时间的bluepill,但在许多流程启动复杂的情况下,它并没有什么帮助。我们最近更喜欢'runit‘,它有许多附带的组件(例如设置用户、环境等的chpset ),这些组件非常有用。我们现在正在使用像chef这样的devops工具来设置具有标准服务的机器,而runit是更好的选择。但是对于其中的任何一个,您都需要您所关心的正在运行的进程的pid才能接收来自监控系统的信号-它听起来就像您从start命令中获得的PID:
/media/apps/myapp/current/lib/async/myscript.rb
不是一直在运行的那个--也许如果你发布更多的脚本,我们可以看到发生了什么,但我猜它在某个地方分叉了另一个进程?
https://stackoverflow.com/questions/18860985
复制相似问题