我有一堆长期运行的Ruby脚本,我想确保每隔30秒左右就会出现这些脚本。
我通常只需ruby script-name.rb
如何配置monit来管理这些脚本?
更新:我试图关注this method to create a wrapper script然后启动ruby进程,但它似乎没有创建.pid文件并输入'./wrapper-script stop'什么都没有:/
我应该在ruby中编写pid还是使用包装器脚本来创建monit所需的pid?
答案 0 :(得分:6)
Monit Wiki有很多配置示例:
http://mmonit.com/wiki/Monit/ConfigurationExamples
选择一个简单的并根据您的需要进行修改。
更新:包装器脚本应在此行中为您创建pid:
echo $$ > /var/run/xyz.pid;
您是否根据需要调整了脚本?它是可执行的(chmod +x
)吗?它是否具有目标的写权限?也许发布你想要使用的包装器,这样我就可以为你提供更多帮助。
答案 1 :(得分:4)
您不需要编写包装脚本或尝试任何类型的黑魔法,只需使用Daemons库即可。
想象一下,你有一个类Worker,它有一个方法“run”,从套接字或类似的东西进入无限循环读取,这就是你编写Daemons包装器的方法:
# this is file my_worker_control.rb
require 'rubygems'
require 'daemons'
require 'worker'
Daemons.run_proc(:app_name => 'my_worker', :dir_mode => :system, :log_output => true ) do
Worker.run
end
脚本完成后,只需从命令行或init.d脚本中调用它:
my_worker_control.rb run | start | stop | restart
此配置将在“/ var / run”下生成“my_worker.pid”文件,您可以使用monit通过使用此文件来监视该进程。
答案 2 :(得分:1)
修改文件:
/etc/init.d/skeleton
您需要稍微修改它,然后:
chmod +x /etc/init.d/process_name
sudo update-rc.d process_name defaults
sudo /etc/init.d/process_name (start| stop| reload )
现在只需使用带有pid的Monit和/var/run/process.pid
开始位置: sudo /etc/init.d/process start
停止位置: sudo /etc/init.d/process stop
干杯
答案 3 :(得分:0)
在ruby脚本中编写pid文件对您来说可能是最简单的(只需打开一个文件并在其中写入$$
)。也就是说,包装脚本方法应该可以正常工作。您的脚本是否有权写入/var/run
中的文件(或者您将pid文件放在何处)?
答案 4 :(得分:0)
作为替代(监控),请查看bluepill。
答案 5 :(得分:0)
(当然不是主题但是)因为它是关于红宝石,你为什么不使用:http://god.rubyforge.org/?
答案 6 :(得分:0)
将此行添加到您的ruby脚本yourapp.rb,该脚本会创建名为pid
yourapp.pid
文件
File.open('/somepath/yourapp.pid', 'w') {|f| f.write Process.pid }
配置Monit以检查/etc/monit/conf.d/yourapp中的pid
使用pidfile /somepath/yourapp.pid检查进程yourapp