使用Monit监控Ruby进程

13

我有一堆长时间运行的Ruby脚本,我想确保它们每隔30秒就能正常工作。

我通常通过简单的ruby script-name.rb命令来启动这些脚本。

我该如何配置monit来监视这些脚本?

更新:我尝试按照这个方法创建包装脚本来启动Ruby进程,但似乎并没有创建.pid文件,而键入'./wrapper-script stop'也没有任何反应 :/

我应该在Ruby中编写pid,还是使用包装脚本创建monit所需的pid?

7个回答

6

Monit Wiki有很多配置示例:

http://mmonit.com/wiki/Monit/ConfigurationExamples

只需选择一个简单的示例,根据您的需要进行修改。

更新:包装脚本应在此行为您创建pid:

echo $$ > /var/run/xyz.pid;

您是否根据自己的需求进行了脚本调整?它是否可执行(chmod +x)?对于目标位置是否具有写入权限?也许您可以发布您正在尝试使用的包装器,这样我可以更好地帮助您。


谢谢,但我在磁盘上找不到Ruby进程的.pid文件? - Tom
5
如果您的脚本没有创建PID文件,那么就没有PID文件。要么修改脚本以创建一个PID文件,要么按照常见问题解答入口操作:http://mmonit.com/wiki/Monit/FAQ#pidfile - Michael Kohl
汤姆,你在这方面有进展吗?链接有帮助吗?如果没有,也许编辑你的问题让我们知道你已经做到了哪一步。 - Michael Kohl

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通过使用此文件来监视进程。


你有守护进程的使用示例吗? - Tom
最终,这只是一个包装脚本,封装在 Ruby gem 中。来自 Monit Wiki 的 bash 版本并不比这更神秘。 - Michael Kohl
没错,但是这个包装脚本可以成为你 Ruby 代码的“主”脚本,它是启动一切的脚本,无需处理 bash、编写 pid 文件、处理日志或任何类似的事情。Daemons 将为您处理所有这些东西。 - Maurício Linhares
当然,我并不是想暗示“守护进程”没用,我自己在SO上也推荐过它。无论如何,我们就同意这是一个很棒的gem吧 :-) - Michael Kohl
这个要简单得多。然而,我对我的脚本在命令行上运行与monit运行时的表现感到沮丧。当我自己运行它时,它可以正常工作,但是当monit运行它时,它会运行,但是会出现之前没有出现过的错误。这非常难以调试,因为我不知道monit正在创建什么特殊条件来干扰我的脚本。 - philipkd
Monit的问题可能与您的PATH变量有关,请确保您对所有需要的命令使用完整路径。 - Maurício Linhares

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 ) 

现在只需使用位于 /var/run/process.pid 的 Monit pid 即可。

启动位置:sudo /etc/init.d/process start

停止位置:sudo /etc/init.d/process stop

祝好!


0

在你的 Ruby 脚本 yourapp.rb 中添加以下代码,创建名为 yourapp.pid 的 pid 文件:

File.open('/somepath/yourapp.pid', 'w') {|f| f.write Process.pid }

配置 Monit 检查 /etc/monit/conf.d/yourapp 中的 pid:

check process yourapp with pidfile /somepath/yourapp.pid


0

在你的 Ruby 脚本中编写 pid 文件可能是最简单的方法(只需打开一个文件并在其中写入 $$)。 话虽如此,包装脚本方法也应该可以正常工作。 你的脚本是否有权限写入 /var/run(或者你放置 pid 文件的任何其他位置)?


0
作为(monit)的替代方案,请看一下bluepill

0

我正在使用一台小型VPS,但上帝的内存使用率似乎比我承受得起的还要昂贵。 - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接