我有一堆长时间运行的 Ruby 脚本,我想确保每 30 秒左右这些脚本就会启动。
我通常通过简单地启动命令ruby script-name.rb
如何配置 monit 来管理这些脚本?
更新:我尝试按照这种方法创建一个包装脚本,然后启动 ruby 进程,但它似乎没有创建 .pid 文件,并且键入 './wrapper-script stop' 什么也没做:/
我应该在 ruby 中编写 pid 还是使用包装脚本来创建监视所需的 pid?
我有一堆长时间运行的 Ruby 脚本,我想确保每 30 秒左右这些脚本就会启动。
我通常通过简单地启动命令ruby script-name.rb
如何配置 monit 来管理这些脚本?
更新:我尝试按照这种方法创建一个包装脚本,然后启动 ruby 进程,但它似乎没有创建 .pid 文件,并且键入 './wrapper-script stop' 什么也没做:/
我应该在 ruby 中编写 pid 还是使用包装脚本来创建监视所需的 pid?
Monit Wiki 有很多配置示例:
http://mmonit.com/wiki/Monit/ConfigurationExamples
只需选择一个简单的并根据您的需要进行修改。
更新:包装脚本应该在这一行中为您创建 pid:
echo $$ > /var/run/xyz.pid;
您是否根据需要调整了脚本?它是可执行的(chmod +x
)吗?它是否具有目的地的写入权限?也许发布您尝试使用的包装器,以便我可以为您提供更多帮助。
您无需编写包装脚本或尝试任何类型的黑魔法,只需使用Daemons库即可。
想象一下,你有一个 Worker 类,它有一个方法“run”,它进入一个从套接字读取的无限循环或类似的东西,这是你编写守护程序包装器的方式:
# 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 运行|开始|停止|重新启动
此配置将在“/var/run”下生成一个“my_worker.pid”文件,您可以使用 monit 使用此文件监视进程。
修改文件:
/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 )
现在只需在 /var/run/process.pid 处使用带有 pid 的 Monit
开始位置:sudo /etc/init.d/process start
停止位置: sudo /etc/init.d/process stop
干杯
在您的 ruby 脚本中编写 pid 文件对您来说可能是最简单的(只需打开一个文件并$$
在其中写入)。也就是说,包装脚本方法应该可以正常工作。您的脚本是否有权写入/var/run
(或放置 pidfile 的任何位置)中的文件?
作为替代方案(监视),请查看bluepill。
(当然没有主题但是)因为它是关于红宝石的,你为什么不使用: http: //god.rubyforge.org/?
将此行添加到您的 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