God進程監控框架

監控重啟進程的方案有很多種:

  1. 最簡單的方法,寫個腳本fork進程運行,然后waitpid,如果獲pid后就再次啟動
  2. 最土的方法,配置cron任務,固定時間運行腳本檢查進程是否存在,不存在則啟動
  3. 百度使用qmail里的supervised程序,通過supervised監管進程。

    • 優點:supervised可以啟動daemon程序,對于非daemon需要采用nohup的方式啟動。
    • 缺點:每個進程都要配置自己的supervised,無法做到統一管理。
    • 百度對supervised進行過改造,線上有2個分支,基本功能類似,如:進程掛掉后的重啟次數、重啟前調用腳本處理、重啟時報警功能。
  4. 使用supervisord
    supervisord是python寫的進程監控工具(http://supervisord.org/),網上也有很詳細的中文教程,提供2個工具supervisord和supervisorctl 

    • supervisord 用來啟動supervisord
    • supervisorctl start/stop/restart/status [process_name] 對進程進行控制和狀態查看
    • 提供一個http server,能夠在瀏覽器查看和操作進程啟停。同時提供xmlrpc功能,可以自己編寫CLI程序遠程call supervisord的接口
    • 缺點:不能對daemon程序監控,supervisord退出后會使被監管的進程也退出
  5. 使用monit
    monit的功能基本上和supervisord類似,占用內存也非常少,大概在2M左右,不過實在不喜歡它的進程配置語法。 

    • 優點:支持進程資源只用判斷,當進程使用cpu/mem超過多少進行重啟。當進程異常不斷重啟時,也支持各種條件。
  6. 使用god
    god的功能和supervisord、monit比較類似,接下來會重點介紹God的相關功能

God 進程監控

God是由ruby編寫的進程監控框架(http://godrb.com),安裝、配置都很簡單,大概的功能如下:
優點:

    1. 啟動和控制都使用一個命令: god
    2. 可以管理daemon和非daemon進程
    3. 可以設置進程的uid、env、dir、log等參數
    4. 進程配置文件和supervisord類似,但使用ruby的語法。支持類似monit的,對進程使用資源和各種條件的控制
    5. 支持進程配置動態加載功能
    6. 支持把多個進程配置拆分成單獨的配置文件,類似include功能
    7. 支持通知功能,包括:Webhook、Email、Twitter、Jabber、Campfire等多個接口
    8. 根據PID的方式進行監控,GOD可以隨便升級和重啟

缺點:

    1. 不提供web端和rpc接口
    2. log查看stdrr/stdout 功能似乎不能正常work,不過我基本上用不到這個功能
    3. linux下采用2種方式檢測進程poll和event。root默認啟用event模式,如果啟動的進程錯誤,它會注冊一個proc_exit事件,但無法響應。

一、 安裝


需要有ruby環境,>= ruby 1.8.7,支持redhat、ubuntu、centos

1

[sudo] gem install god

二、 一個簡單的實例

  1. 編寫一個簡單的ruby程序,hello.rb:

    1
    2
    3
    4

    loop do
      puts “hello God!”
      sleep 5
    end

  2. 編寫進程配置文件,hello.god:

    1
    2
    3
    4
    5
    6

    God.watch do |w|
      w.name = “hello”
      w.start = “ruby /home/work/ruby/hello.rb”
      w.keepalive(:memory_max => 150.megabytes,
                  :cpu_max => 50.percent)
    end

  3. 啟動god,加載配置,有2種方式:

    1. 啟動god同時加載配置: god -c hello.god
    2. 先啟動god,再加載配置: god && god load hello.god

這個時候可以用ps查看,hello.rb已經啟動起來。使用god status 可以查看到狀態如下:

1

hello: up

在hello.god配置中,我們配置了:memory_max和:cpu_max,當hello.rb使用cpu或mem超過我們配置的內容時,god就會重啟該進程。

使用如下命令,對進程進行各種控制,具體見god –help:

1

god start/stop/restart/status/monitor/unmonitor/remove/log [process_name]

三、 進一步使用

  1. 配置文件中加載其他god文件

    1

    God.load “/home/god/conf/*.god”

  2. 已經啟動god后,使用god load 動態加載配置
  3. god pid文件,root啟動時在/var/run/god, 普通賬號在~/.god/
  4. god -D 非daemon方式運行God
  5. god status 看到的狀態有3種:up、unmonitored、error(一般不會出現)
  6. god支持設置uid,pid,dir,chroot,env等各種參數,詳細見godrb.com
  7. 進程啟動觸發郵件發送,配置如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

    God::Contacts::Email.defaults do |d|
      d.from_email = ‘god@xxx.com’
      d.from_name = ‘God’
      d.delivery_method = :sendmail
    end
     
    God.contact(:email) do |c|
      c.name = ‘wilbur’
      c.group = ‘developers’
      c.to_email = ‘wilbur@xxx.com’
    end
     
    w.transition(:up, :start) do |on|
      on.condition(:process_exits) do |c|
        c.notify = ‘wilbur’
      end
    end

四、 經驗分享

  1. 實際測試時,只有log功能不能正常工作
  2. 測試配置一個錯誤的w.start = “ruby ddd.rb”, ddd.rb不存在

    1. 在root環境下god默認使用event模式,由于該進程啟動命令錯誤,注冊一個proc_exit(pid_num)后,沒有再次啟動.
      使用god status 查看,進程一直是up狀態,但查看進程pid不存在
    2. 使用poll模式進行進程監控,查看god日志。god不斷重啟該進程
      使用god status查看,進程也是up狀態。查看代碼,因為god在啟動進程的時候會將它狀態變成up狀態,下次周期檢查時,發現進程掛了,又重啟,又將狀態修改為up狀態。
      所以在任何時刻下查看進程都是up狀態,可以使用如下配置方式進行解決: 

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21

      God.watch do |w|
        w.name = “hello”
        w.start = “ruby /home/work/ruby/hello.rb”
        w.keepalive(:memory_max => 150.megabytes,
                    :cpu_max => 50.percent)
        w.lifecycle do |on|
          on.condition(:flapping) do |c|
            c.to_state = [:start, :restart]
            c.times = 5
            c.within = 5.minute
            c.transition = :unmonitored
            c.retry_in = 10.minutes
            c.retry_times = 5
            c.retry_within = 2.hours
          end
        end
      end
      #當進程異常,會導致god不斷重啟
      #使用:flapping條件
      #5分鐘內start或者restart進程 5次,如果啟動失敗,修改狀態為unmonitored
      #10分鐘后再次嘗試啟動,如果2個小時內,嘗試5次都失敗,徹底放棄

  3. god使用ruby的drb進行通信,所以很容易寫一個web server+xmlrpc功能,通過drb控制god.
  4. god load對.god內容正確性沒有檢查,可以使用god load 加載一個ruby程序。

原文鏈接:http://zoomq.qiniudn.com/ZQScrapBook/ZqFLOSS/tree/item20081015105037-frameset.html

原創文章,作者:追馬,如若轉載,請注明出處:http://www.www58058.com/468

(2)
追馬追馬
上一篇 2015-02-13
下一篇 2015-02-14

相關推薦

  • LINUX用戶建立秘鑰認證實現SHELL腳本管理,分發,部署

    環境介紹 SSH Server [root@vm1 ~]# ifconfig |awk '/broadcast/{print $2}' 192.168.99.241 SSH Client [root@vm2 ~]# ifconfig |awk '…

    Linux干貨 2017-01-05
  • 第二周- -問題總結

    前言:這周學習了文件的基本操作、用戶和權限管理、重定向和管道。 1.在centos6.9當中,創建虛擬機的時候,網絡無法獲取地址,ping也不通,出現  device eth0 does not seem to be present, delaying initialization 答:(1).虛擬機啟動出錯,就把這個虛擬機刪除掉重新建立,系統虛擬…

    2017-07-23
  • Linux系統下的bonding設置

    bonding多個物理網卡聚合成一個虛擬網卡     Bonding,其原理是講多個物理網卡聚合成一個虛擬網卡,一張網卡正常工作,其余網卡作為備用,每隔一段時間(miimon=毫秒),向正常工作的網卡發一狀態詢問,若沒回復,則認為其運行失敗,然后就會啟用備用網卡,但是IP地址不會改變。   &nbs…

    Linux干貨 2016-09-07
  • 第四周(1):課堂練習與作業

    課堂練習: 1、刪除/etc/grub.conf文件中所有以空白開頭的行行首的空白字符 [root@centos6 ~]# sed 's@^[[:space:]]\+@@' /etc/grub.conf 2、刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空白字符的行的行首的#和空白字符 …

    Linux干貨 2016-08-10
  • 推薦-LINUX磁盤管理

    Evernote Export LINUX磁盤管理 linux學習筆記 磁盤分區 文件系統 掛載 在操作系統中,磁盤管理屬于設備管理的范疇。一塊硬盤安裝到主機之后稱為裸設備,若要能夠在Linux系統中使用必須對其進行如下步驟:分區=>格式化(創建文件系統)=>掛載 LINUX系統的設備類型 Linux沿襲Unix的風格,將所有設備認成是一個文件 …

    Linux干貨 2016-04-05
  • 文件元數據信息詳解

    文件元數據信息詳解 文件的元數據是什么? 文件的數據分為兩類:一類為數據,即文件的實際內容;另一類為元數據,用來描述文件的特征。 元數據內容: 文件名 文件大小 文件所在數據塊 數據塊的大小 文件類型 文件所在的Inode 硬鏈接次數 權限 屬主id 屬組id 最近一次訪問時間戳 最近一次更改文件內容的時間戳 最近一次更改文件元數據的時間戳 查看文件的元數據…

    Linux干貨 2017-07-09
欧美性久久久久