Daemonization

RExec Daemon framework provides a very simple solution for long running daemon processes. Here is an example XML-RPC daemon:

#!/usr/bin/env ruby

# Copyright (c) 2007, 2009 Samuel Williams. Released under the GNU GPLv3.

require 'rubygems'

require 'pathname'

require 'rexec'
require 'rexec/daemon'

require 'webrick'
require 'webrick/https'
require 'xmlrpc/server'

# Very simple XMLRPC daemon
class TestDaemon < RExec::Daemon::Base
  @@var_directory = Pathname.new(__FILE__).dirname + "var"
  
  def self.run
    puts "Starting server..."
    
    @@rpc_server = WEBrick::HTTPServer.new(
      :Port => 11235,
      :BindAddress => "0.0.0.0",
      :SSLEnable => true,
      :SSLVerifyClient => OpenSSL::SSL::VERIFY_NONE,
      :SSLCertName => [["CN", WEBrick::Utils::getservername]])
    
    @@listener = XMLRPC::WEBrickServlet.new
    
    @@listener.add_handler("add") do |amount|
      @@count ||= 0
      @@count += amount
    end
    
    @@listener.add_handler("total") do
      @@count
    end
    
    @@rpc_server.mount("/RPC2", @@listener)
    
    @@rpc_server.start
    
    puts "Exiting server..."
  end
  
  def self.shutdown
    @@rpc_server.shutdown
  end
end

TestDaemon.daemonize

To start and stop this daemon, if the file was called daemon.rb:

$ ./daemon.rb start
Daemon starting...
Waiting for daemon to start (5/5)
Daemon started: 14969
$ ./daemon.rb status
running
$ ./daemon.rb stop
Sending TERM...
$ ./daemon.rb status
stopped

This daemon will continue to run in the background, until it is stopped. This is because it detaches from the terminal you start it from, and thus is not closed when you close the terminal.