天天看点

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,如需转载请自行联系原作者