<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Jetpack Flight Log &#187; god</title>
	<atom:link href="http://jetpackweb.com/blog/tags/god/feed/" rel="self" type="application/rss+xml" />
	<link>http://jetpackweb.com/blog</link>
	<description>Rock{et}ing the interweb</description>
	<lastBuildDate>Sun, 12 Jun 2011 17:51:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Monitoring delayed_job with god on CentOS</title>
		<link>http://jetpackweb.com/blog/2009/11/02/monitoring-delayed_job-with-god-on-centos/</link>
		<comments>http://jetpackweb.com/blog/2009/11/02/monitoring-delayed_job-with-god-on-centos/#comments</comments>
		<pubDate>Mon, 02 Nov 2009 22:24:51 +0000</pubDate>
		<dc:creator>Brian Racer</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[centos]]></category>
		<category><![CDATA[delayed_job]]></category>
		<category><![CDATA[god]]></category>

		<guid isPermaLink="false">http://jetpackweb.com/blog/?p=570</guid>
		<description><![CDATA[I recently started using god rather than monit for process monitoring. god lets me be a bit more expressive with how I want processes monitored using the the power of Ruby. The current project I am working on has a number of tasks that I want processed asynchronously so I will setup god to monitor [...]]]></description>
			<content:encoded><![CDATA[<p>I recently started using <a href="http://god.rubyforge.org/" target="_blank">god</a> rather than <a href="http://mmonit.com/monit/" target="_blank">monit</a> for process monitoring. <strong>god</strong> lets me be a bit more expressive with how I want processes monitored using the the power of Ruby.</p>
<p>The current project I am working on has a number of tasks that I want processed asynchronously so I will setup <strong>god</strong> to monitor my <a href="http://github.com/collectiveidea/delayed_job" target="_blank">delayed_jobs</a>. If you are not familiar with awesome delayed_job gem, watch the excellent <a href="http://railscasts.com/episodes/171-delayed-job" target="_blank">Railscast tutorial</a>.</p>
<p>First install the god gem:</p>

<div class="wp_syntax"><div class="code"><pre class="bash">$ <span class="kw2">sudo</span> gem <span class="kw2">install</span> god</pre></div></div>

<p>Next we will create a Redhat compatible init script for god:</p>

<div class="wp_syntax"><div class="code"><pre class="bash">$ <span class="kw2">sudo</span> <span class="kw2">vi</span> <span class="sy0">/</span>etc<span class="sy0">/</span>init.d<span class="sy0">/</span>god
&nbsp;
<span class="co0">#!/bin/bash</span>
<span class="co0">#</span>
<span class="co0"># God</span>
<span class="co0">#</span>
<span class="co0"># chkconfig: - 85 15</span>
<span class="co0"># description: start, stop, restart God (bet you feel powerful)</span>
<span class="co0">#</span>
&nbsp;
<span class="re2">RETVAL</span>=<span class="nu0">0</span>
&nbsp;
<span class="kw1">case</span> <span class="st0">&quot;$1&quot;</span> <span class="kw1">in</span>
    start<span class="br0">&#41;</span>
      <span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span>god <span class="re5">-P</span> <span class="sy0">/</span>var<span class="sy0">/</span>run<span class="sy0">/</span>god.pid <span class="re5">-l</span> <span class="sy0">/</span>var<span class="sy0">/</span>log<span class="sy0">/</span>god.log
      <span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span>god load <span class="sy0">/</span>etc<span class="sy0">/</span>god.conf
      <span class="re2">RETVAL</span>=<span class="re4">$?</span>
      <span class="sy0">;;</span>
    stop<span class="br0">&#41;</span>
      <span class="kw2">kill</span> <span class="sy0">`</span><span class="kw2">cat</span> <span class="sy0">/</span>var<span class="sy0">/</span>run<span class="sy0">/</span>god.pid<span class="sy0">`</span>
      <span class="re2">RETVAL</span>=<span class="re4">$?</span>
      <span class="sy0">;;</span>
    restart<span class="br0">&#41;</span>
      <span class="kw2">kill</span> <span class="sy0">`</span><span class="kw2">cat</span> <span class="sy0">/</span>var<span class="sy0">/</span>run<span class="sy0">/</span>god.pid<span class="sy0">`</span>
      <span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span>god <span class="re5">-P</span> <span class="sy0">/</span>var<span class="sy0">/</span>run<span class="sy0">/</span>god.pid <span class="re5">-l</span> <span class="sy0">/</span>var<span class="sy0">/</span>log<span class="sy0">/</span>god.log
      <span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span>god load <span class="sy0">/</span>etc<span class="sy0">/</span>god.conf
      <span class="re2">RETVAL</span>=<span class="re4">$?</span>
      <span class="sy0">;;</span>
    status<span class="br0">&#41;</span>      
      <span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span>god status
      <span class="re2">RETVAL</span>=<span class="re4">$?</span>
      <span class="sy0">;;</span>
    <span class="sy0">*</span><span class="br0">&#41;</span>
      <span class="kw3">echo</span> <span class="st0">&quot;Usage: god {start|stop|restart|status}&quot;</span>
      <span class="kw3">exit</span> <span class="nu0">1</span>
  <span class="sy0">;;</span>
<span class="kw1">esac</span>
&nbsp;
<span class="kw3">exit</span> <span class="re1">$RETVAL</span></pre></div></div>

<h6>(adapted from debian version at <a href="http://mylescarrick.com/articles/simple_delayed_job_with_god" target="_blank">http://mylescarrick.com/articles/simple_delayed_job_with_god</a>)</h6>
<p>Now adjust the permissions, and set the init script to start on system boot:</p>

<div class="wp_syntax"><div class="code"><pre class="bash">$ <span class="kw2">sudo</span> <span class="kw2">chmod</span> a+x <span class="sy0">/</span>etc<span class="sy0">/</span>init.d<span class="sy0">/</span>god
$ <span class="kw2">sudo</span> <span class="sy0">/</span>sbin<span class="sy0">/</span>chkconfig <span class="re5">--add</span> god
$ <span class="kw2">sudo</span> <span class="sy0">/</span>sbin<span class="sy0">/</span>chkconfig <span class="re5">--level</span> <span class="nu0">345</span> god on</pre></div></div>

<p>Before we start <strong>god</strong> up, we need to create a configuration file that tells it what configuration files to load:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby">$ sudo vi <span class="sy0">/</span>etc<span class="sy0">/</span>god.<span class="me1">conf</span>
&nbsp;
God.<span class="kw3">load</span> <span class="st0">&quot;/srv/apps/your_app/current/config/god/*.god&quot;</span></pre></div></div>

<p>You will need to adjust the above depending on how you have your app setup. When working in a Rails project I like to put my god scripts in <i>config/god</i>.</p>
<p>We will use <a href="http://github.com/blog/229-dj-god" target="_blank">a script</a> from the guys at github to monitor our job daemon. I tweaked it slightly to have less workers, and to set the environment properly.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby">RAILS_ROOT = <span class="st0">&quot;/srv/apps/your_app/current&quot;</span>
&nbsp;
<span class="nu0">1</span>.<span class="me1">times</span> <span class="kw1">do</span> <span class="sy0">|</span>num<span class="sy0">|</span>
  God.<span class="me1">watch</span> <span class="kw1">do</span> <span class="sy0">|</span>w<span class="sy0">|</span>
    w.<span class="me1">name</span> = <span class="st0">&quot;dj-#{num}&quot;</span>
    w.<span class="me1">group</span> = <span class="st0">'dj'</span>
    w.<span class="me1">interval</span> = <span class="nu0">30</span>.<span class="me1">seconds</span>
    w.<span class="me1">start</span> = <span class="st0">&quot;rake -f #{RAILS_ROOT}/Rakefile RAILS_ENV=production jobs:work&quot;</span>
&nbsp;
    w.<span class="me1">uid</span> = <span class="st0">'your_app_user'</span>
    w.<span class="me1">gid</span> = <span class="st0">'your_app_user'</span>
&nbsp;
    <span class="co1"># retart if memory gets too high</span>
    w.<span class="me1">transition</span><span class="br0">&#40;</span><span class="re3">:up</span>, <span class="re3">:restart</span><span class="br0">&#41;</span> <span class="kw1">do</span> <span class="sy0">|</span>on<span class="sy0">|</span>
      on.<span class="me1">condition</span><span class="br0">&#40;</span><span class="re3">:memory_usage</span><span class="br0">&#41;</span> <span class="kw1">do</span> <span class="sy0">|</span>c<span class="sy0">|</span>
        c.<span class="me1">above</span> = <span class="nu0">300</span>.<span class="me1">megabytes</span>
        c.<span class="me1">times</span> = <span class="nu0">2</span>
      <span class="kw1">end</span>
    <span class="kw1">end</span>
&nbsp;
    <span class="co1"># determine the state on startup</span>
    w.<span class="me1">transition</span><span class="br0">&#40;</span><span class="re3">:init</span>, <span class="br0">&#123;</span> <span class="kw2">true</span> <span class="sy0">=&gt;</span> <span class="re3">:up</span>, <span class="kw2">false</span> <span class="sy0">=&gt;</span> <span class="re3">:start</span> <span class="br0">&#125;</span><span class="br0">&#41;</span> <span class="kw1">do</span> <span class="sy0">|</span>on<span class="sy0">|</span>
      on.<span class="me1">condition</span><span class="br0">&#40;</span><span class="re3">:process_running</span><span class="br0">&#41;</span> <span class="kw1">do</span> <span class="sy0">|</span>c<span class="sy0">|</span>
        c.<span class="me1">running</span> = <span class="kw2">true</span>
      <span class="kw1">end</span>
    <span class="kw1">end</span>
&nbsp;
    <span class="co1"># determine when process has finished starting</span>
    w.<span class="me1">transition</span><span class="br0">&#40;</span><span class="br0">&#91;</span><span class="re3">:start</span>, <span class="re3">:restart</span><span class="br0">&#93;</span>, <span class="re3">:up</span><span class="br0">&#41;</span> <span class="kw1">do</span> <span class="sy0">|</span>on<span class="sy0">|</span>
      on.<span class="me1">condition</span><span class="br0">&#40;</span><span class="re3">:process_running</span><span class="br0">&#41;</span> <span class="kw1">do</span> <span class="sy0">|</span>c<span class="sy0">|</span>
        c.<span class="me1">running</span> = <span class="kw2">true</span>
        c.<span class="me1">interval</span> = <span class="nu0">5</span>.<span class="me1">seconds</span>
      <span class="kw1">end</span>
&nbsp;
      <span class="co1"># failsafe</span>
      on.<span class="me1">condition</span><span class="br0">&#40;</span><span class="re3">:tries</span><span class="br0">&#41;</span> <span class="kw1">do</span> <span class="sy0">|</span>c<span class="sy0">|</span>
        c.<span class="me1">times</span> = <span class="nu0">5</span>
        c.<span class="me1">transition</span> = <span class="re3">:start</span>
        c.<span class="me1">interval</span> = <span class="nu0">5</span>.<span class="me1">seconds</span>
      <span class="kw1">end</span>
    <span class="kw1">end</span>
&nbsp;
    <span class="co1"># start if process is not running</span>
    w.<span class="me1">transition</span><span class="br0">&#40;</span><span class="re3">:up</span>, <span class="re3">:start</span><span class="br0">&#41;</span> <span class="kw1">do</span> <span class="sy0">|</span>on<span class="sy0">|</span>
      on.<span class="me1">condition</span><span class="br0">&#40;</span><span class="re3">:process_running</span><span class="br0">&#41;</span> <span class="kw1">do</span> <span class="sy0">|</span>c<span class="sy0">|</span>
        c.<span class="me1">running</span> = <span class="kw2">false</span>
      <span class="kw1">end</span>
    <span class="kw1">end</span>
  <span class="kw1">end</span>
<span class="kw1">end</span></pre></div></div>

<p>It&#8217;s now time to start the daemon:</p>

<div class="wp_syntax"><div class="code"><pre class="bash">$ <span class="kw2">sudo</span> <span class="sy0">/</span>etc<span class="sy0">/</span>init.d<span class="sy0">/</span>god start
$ <span class="kw2">sudo</span> <span class="sy0">/</span>etc<span class="sy0">/</span>init.d<span class="sy0">/</span>god status
dj:
  dj-<span class="nu0">0</span>: up</pre></div></div>

<p>Looks good! If you want to make sure it&#8217;s working, kill the rake task running <strong>jobs:work</strong>. god will see that it is stopped and automatically restart it!</p>
]]></content:encoded>
			<wfw:commentRss>http://jetpackweb.com/blog/2009/11/02/monitoring-delayed_job-with-god-on-centos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

