天天看點

Linux程序管理工具--God-詳解(1)-入門

God是一個由Ruby編寫的監控架構,它可以保障你的程序為運作狀态,以及可以對一些特殊情況進行程序的重新開機。拓展可以通過frigga來進行全局god的管理。

  最好的安裝方式(通過ruby-gems):

1

<code>gem </code><code>install</code> <code>god</code>

快速啟動

 注意:快速啟動需要0.12版本以上的,你可以使用以下指令檢視版本:

<code>god --version</code>

  一個簡單的例子:使用god保持一個簡單的程序。

  下面是一個簡單的腳本,名字為hello.py

2

3

4

5

6

7

<code>#!/usr/bin/env python</code>

<code>#</code>

<code>import</code> <code>time</code>

<code>while</code> <code>True</code><code>:</code>

<code>  </code><code>print</code> <code>"hello"</code>

<code>  </code><code>time.sleep(</code><code>1</code><code>)</code>

  現在寫一個god的配置檔案來管理上邊的hello.py的程序,simple.god:

<code>God.watch </code><code>do</code> <code>|w|</code>

<code>  </code><code>w.name = </code><code>"hello"</code>

<code>  </code><code>w.start = </code><code>"python /root/god/hello.py"</code>

<code>  </code><code>w.keepalive</code>

<code> </code><code>end</code>

  這是一個簡單的god配置,我們首先聲明一個God.watch子產品,它可以監控、控制上邊的程序。每個watch都必須有一個唯一的名字和啟動這個程序的指令。keepalive告訴god保證這個程序的存活,如果這個程序死亡了,god會通過上邊定義的start來啟動程序。

  這個simple的例子中,我們将god運作到前端,進而來保證我們可以進行相關的檢視。

  要運作god,我們需要指定配置檔案(-C),以及要求他在前端運作(-D)

<code>god -C simple.god -D</code>

8

9

10

11

12

13

14

15

16

17

18

<code>#Events</code>

<code>I [2014-08-11 11:10:10]  INFO: Loading simple.god</code>

<code>I [2014-08-11 11:10:10]  INFO: Syslog enabled.</code>

<code>I [2014-08-11 11:10:10]  INFO: Using pid </code><code>file</code> <code>directory: </code><code>/var/run/god</code>

<code>I [2014-08-11 11:10:10]  INFO: Socket already </code><code>in</code> <code>use</code>

<code>I [2014-08-11 11:10:10]  INFO: Socket is stale, reopening</code>

<code>I [2014-08-11 11:10:10]  INFO: Started on drbunix:</code><code>///tmp/god</code><code>.17165.sock</code>

<code>I [2014-08-11 11:10:10]  INFO: hello move </code><code>'unmonitored'</code> <code>to </code><code>'init'</code>

<code>I [2014-08-11 11:10:10]  INFO: hello moved </code><code>'unmonitored'</code> <code>to </code><code>'init'</code>

<code>I [2014-08-11 11:10:10]  INFO: hello [trigger] process is not running (ProcessRunning)</code>

<code>I [2014-08-11 11:10:10]  INFO: hello move </code><code>'init'</code> <code>to </code><code>'start'</code>

<code>I [2014-08-11 11:10:10]  INFO: hello start: python </code><code>/root/god/hello</code><code>.py</code>

<code>I [2014-08-11 11:10:10]  INFO: hello moved </code><code>'init'</code> <code>to </code><code>'start'</code>

<code>I [2014-08-11 11:10:10]  INFO: hello [trigger] process is running (ProcessRunning)</code>

<code>I [2014-08-11 11:10:10]  INFO: hello move </code><code>'start'</code> <code>to </code><code>'up'</code>

<code>I [2014-08-11 11:10:10]  INFO: hello registered </code><code>'proc_exit'</code> <code>event </code><code>for</code> <code>pid 25779</code>

<code>I [2014-08-11 11:10:10]  INFO: hello moved </code><code>'start'</code> <code>to </code><code>'up'</code>

  從DEBUG資訊中,你可以看出來,hello這個程序起初是沒有啟動的,而後god将它啟動。PS:如果是基于輪詢模式啟動,你注意觀察,他會5秒鐘檢查一次程序。

  為了展現基于事件,我這裡多加了一步操作(在别的終端殺掉hello.py,以驗證基于事件的形式):

<code>[root@master ~]</code><code># ps -ef|grep hello.py</code>

<code>root     25779     1  0 11:10 ?        00:00:00 python </code><code>/root/god/hello</code><code>.py</code>

<code>root     25803 25782  0 11:10 pts</code><code>/1</code>    <code>00:00:00 </code><code>grep</code> <code>hello.py</code>

<code>[root@master ~]</code><code># kill -9 25779</code>

<code>#Event 狀态:</code>

<code>I [2014-08-11 11:11:02]  INFO: hello [trigger] process 25779 exited {:thread_group_id=&gt;25779, :pid=&gt;25779, :exit_code=&gt;9, :exit_signal=&gt;17} (ProcessExits)</code>

<code>I [2014-08-11 11:11:02]  INFO: hello move </code><code>'up'</code> <code>to </code><code>'start'</code>

<code>I [2014-08-11 11:11:02]  INFO: hello deregistered </code><code>'proc_exit'</code> <code>event </code><code>for</code> <code>pid 25779</code>

<code>I [2014-08-11 11:11:02]  INFO: hello start: python </code><code>/root/god/hello</code><code>.py</code>

<code>I [2014-08-11 11:11:02]  INFO: hello moved </code><code>'up'</code> <code>to </code><code>'start'</code>

<code>I [2014-08-11 11:11:02]  INFO: hello [trigger] process is running (ProcessRunning)</code>

<code>I [2014-08-11 11:11:02]  INFO: hello move </code><code>'start'</code> <code>to </code><code>'up'</code>

<code>I [2014-08-11 11:11:02]  INFO: hello registered </code><code>'proc_exit'</code> <code>event </code><code>for</code> <code>pid 25807</code>

<code>I [2014-08-11 11:11:02]  INFO: hello moved </code><code>'start'</code> <code>to </code><code>'up'</code>

 PS:如果是輪詢(Polls)模式,它不是即刻啟動,而是等到檢查周期的到來。

  到這裡,你已經知道god如何來保證程序,還有一些更加有空的管理方式,如cpu達到多少重新開機程序,memory達到多少重新開機程序等等,下面是一個配置的例子:

<code>  </code><code>w.keepalive(</code><code>:memory_max</code> <code>=&gt; </code><code>150</code><code>.megabytes,</code>

<code>              </code><code>:cpu_max</code> <code>=&gt; </code><code>50</code><code>.percent)</code>

<code>  </code><code>end</code>

  詳解::memory_max選項屬于keepalive的子指令,:cpu_max同樣也是。上邊的配置中,如果記憶體達到了150M,或CPU達到了50%,god就回重新開機程序。預設情況下,這些程序30秒會被檢查1次,并且會在(5超3次)的時候重新開機,以避免偶爾的超載情況。

<code>I [2014-08-11 13:35:46]  INFO: hello [trigger] cpu out of bounds [5.3571428566083%%, *90.3052064640262%%, *94.7069943292977%%, *96.3414634148933%%] (CpuUsage)</code>

<code>I [2014-08-11 13:35:46]  INFO: hello move </code><code>'up'</code> <code>to </code><code>'restart'</code>

<code>I [2014-08-11 13:35:46]  INFO: hello deregistered </code><code>'proc_exit'</code> <code>event </code><code>for</code> <code>pid 26355</code>

<code>I [2014-08-11 13:35:46]  INFO: hello stop: default lambda killer</code>

<code>I [2014-08-11 13:35:46]  INFO: hello sent SIGTERM</code>

<code>I [2014-08-11 13:35:47]  INFO: hello process stopped</code>

<code>I [2014-08-11 13:35:47]  INFO: hello start: python </code><code>/root/god/hello</code><code>.py</code>

  另外,你可以使用god對一些程序進行操作:

<code>god start hello  </code><code>#hello為程序名.對應simple.god檔案中的w.name</code>

<code>god stop hello</code>

<code>god restart hello</code>

<code>...</code>

  是以,當你使用god的管理程序時候,可以自己編寫一些特定的配置檔案來管理相關的程序。例如:http出錯、磁盤io較大等等問題出現時,可以幫助你做一些事。

本文轉自 陳延宗 51CTO部落格,原文連結:http://blog.51cto.com/407711169/1538541,如需轉載請自行聯系原作者