<?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>dan.thoughts &#187; daemon</title>
	<atom:link href="http://blog.sosedoff.com/tag/daemon/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.sosedoff.com</link>
	<description>Web-development, PHP, Ruby, Sinatra, Merb, Rails, MySQL, SQLite, Web Services.</description>
	<lastBuildDate>Wed, 25 Jan 2012 18:54:45 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Writing very simple daemon in Ruby</title>
		<link>http://blog.sosedoff.com/2009/01/24/writing-very-simple-daemon-in-ruby/</link>
		<comments>http://blog.sosedoff.com/2009/01/24/writing-very-simple-daemon-in-ruby/#comments</comments>
		<pubDate>Sat, 24 Jan 2009 14:06:02 +0000</pubDate>
		<dc:creator>Dan Sosedoff</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[daemon]]></category>

		<guid isPermaLink="false">http://blog.sosedoff.com/?p=35</guid>
		<description><![CDATA[Ruby is very powerful language, not only for web development as many can think for the first time. It is also providing all necessary resources to build system utilities and daemons. So, this post exactly about it.
Long time ago i was looking for some tool to write simple daemon in a short term. I didn`t [...]]]></description>
			<content:encoded><![CDATA[<p>Ruby is very powerful language, not only for web development as many can think for the first time. It is also providing all necessary resources to build system utilities and daemons. So, this post exactly about it.<br />
Long time ago i was looking for some tool to write simple daemon in a short term. I didn`t choose C just because i was able to develop program only on special computer (i mean &#8220;production-like&#8221; environment) and the problem wasnt critical to resources. In other words &#8211; this daemon was working only few days to complete the task. Ok, lets see what we`ve got:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#!/usr/bin/ruby</span>
<span style="color:#008000; font-style:italic;"># ---------------------------------------------------------------------</span>
<span style="color:#008000; font-style:italic;"># MODULES</span>
<span style="color:#008000; font-style:italic;"># ---------------------------------------------------------------------</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'daemonize'</span>
<span style="color:#9966CC; font-weight:bold;">include</span> Daemonize
<span style="color:#9966CC; font-weight:bold;">include</span> <span style="color:#CC00FF; font-weight:bold;">Process</span>
<span style="color:#008000; font-style:italic;"># ---------------------------------------------------------------------</span>
<span style="color:#008000; font-style:italic;"># CONFIGURATION</span>
<span style="color:#008000; font-style:italic;"># ---------------------------------------------------------------------</span>
<span style="color:#ff6633; font-weight:bold;">$daemon</span> = <span style="color:#006600; font-weight:bold;">&#123;</span>
  <span style="color:#ff3333; font-weight:bold;">:name</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#996600;">&quot;Test Daemon&quot;</span>,                  <span style="color:#008000; font-style:italic;"># daemon name</span>
  <span style="color:#ff3333; font-weight:bold;">:abbr</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#996600;">&quot;testd&quot;</span>,                        <span style="color:#008000; font-style:italic;"># daemon abbreviation</span>
  <span style="color:#ff3333; font-weight:bold;">:author</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#996600;">&quot;(c) 2008 author&quot;</span>,            <span style="color:#008000; font-style:italic;"># daemon author</span>
  <span style="color:#ff3333; font-weight:bold;">:version</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#996600;">&quot;0.1&quot;</span>,                       <span style="color:#008000; font-style:italic;"># actual version</span>
  <span style="color:#ff3333; font-weight:bold;">:file_log</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#996600;">&quot;/var/log/testdaemon.log&quot;</span>,  <span style="color:#008000; font-style:italic;"># log path</span>
  <span style="color:#ff3333; font-weight:bold;">:file_pid</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#996600;">&quot;/var/run/testdaemon.pid&quot;</span>,  <span style="color:#008000; font-style:italic;"># process id path</span>
  <span style="color:#ff3333; font-weight:bold;">:delay_sleep</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#006666;">1</span>,                       <span style="color:#008000; font-style:italic;"># seconds</span>
  <span style="color:#ff3333; font-weight:bold;">:user</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#996600;">'tux'</span>,                          <span style="color:#008000; font-style:italic;"># working data user</span>
  <span style="color:#ff3333; font-weight:bold;">:grp</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#996600;">'tux'</span>,                           <span style="color:#008000; font-style:italic;"># working data group</span>
  <span style="color:#ff3333; font-weight:bold;">:background</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#0000FF; font-weight:bold;">false</span>,                    <span style="color:#008000; font-style:italic;"># background mode</span>
  <span style="color:#ff3333; font-weight:bold;">:work</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#0000FF; font-weight:bold;">true</span>                            <span style="color:#008000; font-style:italic;"># daemon work flag</span>
<span style="color:#006600; font-weight:bold;">&#125;</span>
&nbsp;
<span style="color:#ff6633; font-weight:bold;">$daemon_log</span> = <span style="color:#0000FF; font-weight:bold;">nil</span>
<span style="color:#ff6633; font-weight:bold;">$daemon_pid</span> = <span style="color:#0000FF; font-weight:bold;">nil</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># ---------------------------------------------------------------------</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> daemon_log<span style="color:#006600; font-weight:bold;">&#40;</span>str<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;[#{Time.now.strftime(&quot;</span><span style="color:#006600; font-weight:bold;">%</span>m<span style="color:#006600; font-weight:bold;">/%</span>d<span style="color:#006600; font-weight:bold;">/%</span>Y<span style="color:#006600; font-weight:bold;">-%</span>H:<span style="color:#006600; font-weight:bold;">%</span>M:<span style="color:#006600; font-weight:bold;">%</span>S<span style="color:#996600;">&quot;)}] #{str}&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> daemon_terminate
  <span style="color:#ff6633; font-weight:bold;">$daemon</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:work</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#0000FF; font-weight:bold;">false</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> daemon_stop
  daemon_log<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Stopping working process...&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#ff6633; font-weight:bold;">$daemon_pid</span>.<span style="color:#9900CC;">close</span>
  <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">delete</span><span style="color:#006600; font-weight:bold;">&#40;</span>$daemon<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:file_pid</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> daemon_start
  <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">exist</span>?<span style="color:#006600; font-weight:bold;">&#40;</span>$daemon<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:file_pid</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">then</span>
    daemon_log<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Process already running. If it`s not - remove the pid file&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#CC0066; font-weight:bold;">exit</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  daemon_log<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Starting process...&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  daemonize <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#ff6633; font-weight:bold;">$daemon</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:background</span><span style="color:#006600; font-weight:bold;">&#93;</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">begin</span>
    <span style="color:#ff6633; font-weight:bold;">$daemon_pid</span> = <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>$daemon<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:file_pid</span><span style="color:#006600; font-weight:bold;">&#93;</span>,<span style="color:#996600;">&quot;w&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">rescue</span> <span style="color:#6666ff; font-weight:bold;">Errno::EACCES</span>
    daemon_log<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Cannot create PID file. Check the permissions and try again!&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#ff6633; font-weight:bold;">$daemon_pid</span> = <span style="color:#0000FF; font-weight:bold;">nil</span>
    <span style="color:#CC0066; font-weight:bold;">exit</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>  
&nbsp;
  daemon_work
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> daemon_work
  <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#006600; font-weight:bold;">&#40;</span>$daemon_pid<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">then</span>
    <span style="color:#ff6633; font-weight:bold;">$daemon_pid</span>.<span style="color:#9900CC;">sync</span> = <span style="color:#0000FF; font-weight:bold;">true</span>
    <span style="color:#ff6633; font-weight:bold;">$daemon_pid</span>.<span style="color:#CC0066; font-weight:bold;">puts</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">Process</span>.<span style="color:#9900CC;">pid</span>.<span style="color:#9900CC;">to_s</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">begin</span>
      <span style="color:#9966CC; font-weight:bold;">while</span> <span style="color:#ff6633; font-weight:bold;">$daemon</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:work</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
        daemon_log<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Daemon working&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        daemon_handle_signals
        <span style="color:#CC0066; font-weight:bold;">sleep</span><span style="color:#006600; font-weight:bold;">&#40;</span>$daemon<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:delay_sleep</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">rescue</span> <span style="color:#CC00FF; font-weight:bold;">Exception</span> =<span style="color:#006600; font-weight:bold;">&amp;</span>gt; e
      daemon_log<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Error: #{e.message}&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    daemon_stop
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> daemon_handle_signals
  <span style="color:#008000; font-style:italic;"># termination signal</span>
  <span style="color:#CC00FF; font-weight:bold;">Signal</span>.<span style="color:#CC0066; font-weight:bold;">trap</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;TERM&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    daemon_log<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;TERM signal received.&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    daemon_terminate
  <span style="color:#9966CC; font-weight:bold;">end</span>  
&nbsp;
  <span style="color:#008000; font-style:italic;"># kill signal</span>
  <span style="color:#CC00FF; font-weight:bold;">Signal</span>.<span style="color:#CC0066; font-weight:bold;">trap</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;KILL&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    daemon_log<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;KILL signal received.&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    daemon_terminate
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># keyboard interruption</span>
  <span style="color:#CC00FF; font-weight:bold;">Signal</span>.<span style="color:#CC0066; font-weight:bold;">trap</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;INT&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    daemon_log<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;SIGINT signal received.&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    daemon_terminate
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#CC00FF; font-weight:bold;">Signal</span>.<span style="color:#CC0066; font-weight:bold;">trap</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;TSTP&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    daemon_log<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;SIGTSTP signal received.&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> daemon_show_version
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;#{$daemon[:name]} v#{$daemon[:version]} #{$daemon[:author]}&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> daemon_show_usage
  daemon_show_version
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Usage:&quot;</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;    -b, --background        work in background mode&quot;</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;    -v, --version           view version of daemon&quot;</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;    -h, --help              view this help&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> daemon_parse_opts
  <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#0000FF; font-weight:bold;">true</span> <span style="color:#9966CC; font-weight:bold;">if</span> ARGV.<span style="color:#9900CC;">length</span> == <span style="color:#006666;">0</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">case</span> ARGV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>
    <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#996600;">'-b'</span>, <span style="color:#996600;">'--background'</span>
      <span style="color:#ff6633; font-weight:bold;">$daemon</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:background</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#0000FF; font-weight:bold;">true</span>;
      <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#0000FF; font-weight:bold;">true</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#996600;">'-v'</span>, <span style="color:#996600;">'--version'</span>
      daemon_show_version
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#996600;">'-h'</span>, <span style="color:#996600;">'--help'</span>
      daemon_show_usage
    <span style="color:#9966CC; font-weight:bold;">else</span>
      <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Invalid argument: #{ARGV[0]}&quot;</span> <span style="color:#9966CC; font-weight:bold;">if</span> !ARGV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#0000FF; font-weight:bold;">nil</span>?
      daemon_show_usage
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#0000FF; font-weight:bold;">false</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> daemon_main
  daemon_start <span style="color:#9966CC; font-weight:bold;">if</span> daemon_parse_opts
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
daemon_main</pre></div></div>

<p>This is just a basic structure of daemon, it supports background mode. I removed all unimportant information and left only main program cycles. As you can see, the entry point of whole program &#8211; daemon_main procedure. It parsing the command line parameters. In this example there is no required parameters, so daemon will run in basic mode (not background). To enable background you should specify the -d (or &#8211;background) option. Also, very important &#8211; this example needs to be executed under root or other user that have access to /var/run. Other way, PID file path can be changed to whatever you want (file_pid key). All daemon configuration variables stored in array $daemon. Also, it supports system signals handling, like SIGTERM or SIGKILL (all ruby signal constants u can explore <a href="http://www.ruby-doc.org/core/classes/Signal.html" target="_blank">here</a>).</p>
<p>I think that`s it. Not a lot, but very simple. Download script: <a href="http://files.sosedoff.com/b57415aa/">http://files.sosedoff.com/b57415aa/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sosedoff.com/2009/01/24/writing-very-simple-daemon-in-ruby/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

