【问题标题】:Monitor ruby processes with Monit使用 Monit 监控 ruby​​ 进程
【发布时间】:2011-01-10 20:59:27
【问题描述】:

我有一堆长时间运行的 Ruby 脚本,我想确保每 30 秒左右这些脚本就会启动。

我通常通过简单的ruby script-name.rb 来启动命令

如何配置 monit 来管理这些脚本?

更新:我尝试关注this method to create a wrapper script,然后它会启动 ruby​​ 进程,但它似乎没有创建 .pid 文件,并且键入 './wrapper-script stop' 什么也没做: /

我应该在 ruby​​ 中编写 pid 还是使用包装脚本来创建监控所需的 pid?

【问题讨论】:

    标签: ruby monitoring monit


    【解决方案1】:

    Monit Wiki 有很多配置示例:

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

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

    更新:包装脚本应该在这一行为你创建 pid:

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

    您是否根据需要调整了脚本?它是否可执行(chmod +x)?它是否具有目的地的写入权限?也许发布您尝试使用的包装器,以便我可以为您提供更多帮助。

    【讨论】:

    • 谢谢,但我在磁盘上找不到用于 ruby​​ 进程的 .pid 文件?
    • 好吧,如果你的脚本没有创建一个,那么就没有 PID 文件。修改您的脚本以创建一个或遵循常见问题解答条目:mmonit.com/wiki/Monit/FAQ#pidfile
    • 汤姆,你在这方面有什么进展吗?链接有帮助吗?如果没有,也许编辑你的问题,让我们知道你走了多远。
    【解决方案2】:

    您无需编写包装脚本或尝试任何黑魔法,只需使用 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 run|start|stop|restart

    此配置将在“/var/run”下生成一个“my_worker.pid”文件,您可以通过该文件使用monit监控进程。

    【讨论】:

    • 你有守护进程的使用示例吗?
    • 最后,这也只是一个包装脚本,在 Ruby gem 中抽象出来。 Monit Wiki 中的 bash 版本不再是“黑魔法”了。
    • 是的,但是这个包装脚本可以是你的 ruby​​ 代码上的“主”脚本,启动它的脚本,不需要处理 bash、编写 pid 文件、处理日志记录或类似的东西.守护进程会为你处理所有这些事情。
    • 当然,我并不是要暗示“守护进程”没有用,我自己在 SO 上推荐了它。无论如何,让我们同意这是一个很酷的宝石:-)
    • 这更容易使用。但是,我对在命令行上运行的脚本与在 monit 运行时感到沮丧。当我运行它时它可以工作,但是当 monit 运行它时,它会运行,但是有一些错误没有出现。调试起来非常困难,因为我不知道 monit 正在创建什么特殊条件,这会弄乱我的脚本。
    【解决方案3】:

    修改文件:

    /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

    干杯

    【讨论】:

      【解决方案4】:

      在您的 ruby​​ 脚本中编写 pid 文件对您来说可能是最简单的(只需打开一个文件并在其中写入 $$)。也就是说,包装脚本方法应该可以正常工作。您的脚本是否有权写入 /var/run(或您放置 pidfile 的任何位置)中的文件?

      【讨论】:

        【解决方案5】:

        作为替代方法(监视),请查看bluepill

        【讨论】:

          【解决方案6】:

          (当然不是主题,但是)因为它是关于红宝石的,你为什么不使用:http://god.rubyforge.org/

          【讨论】:

          • 我正在使用一个微型 VPS,Gods 的内存使用似乎比我能承受的要贵。
          【解决方案7】:

          将此行添加到您的 ruby​​ 脚本 yourapp.rb 中,这将创建一个名为 yourapp.pidpid 文件

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

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

          使用 pidfile /somepath/yourapp.pid 检查进程 yourapp

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-03-29
            • 2012-01-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多