you are in: codestackercodes [RSS] → tag: daemon [RSS]

Ruby daemon module Delicious

show/hide lines
   1  require 'fileutils'
   2  
   3  module Daemon
   4    WorkingDirectory = File.expand_path(File.dirname(__FILE__))  
   5  
   6    class Base
   7      def self.pid_fn
   8        File.join(WorkingDirectory, "#{name}.pid")
   9      end
  10      
  11      def self.daemonize
  12        Controller.daemonize(self)
  13      end
  14    end
  15    
  16    module PidFile
  17      def self.store(daemon, pid)
  18        File.open(daemon.pid_fn, 'w') {|f| f << pid}
  19      end
  20      
  21      def self.recall(daemon)
  22        IO.read(daemon.pid_fn).to_i rescue nil
  23      end
  24    end
  25    
  26    module Controller
  27      def self.daemonize(daemon)
  28        case !ARGV.empty? && ARGV[0]
  29        when 'start'
  30          start(daemon)
  31        when 'stop'
  32          stop(daemon)
  33        when 'restart'
  34          stop(daemon)
  35          start(daemon)
  36        else
  37          puts "Invalid command. Please specify start, stop or restart."
  38          exit
  39        end
  40      end
  41      
  42      def self.start(daemon)
  43        fork do
  44          Process.setsid
  45          exit if fork
  46          PidFile.store(daemon, Process.pid)
  47          Dir.chdir WorkingDirectory
  48          File.umask 0000
  49          STDIN.reopen "/dev/null"
  50          STDOUT.reopen "/dev/null", "a"
  51          STDERR.reopen STDOUT
  52          trap("TERM") {daemon.stop; exit}
  53          daemon.start
  54        end
  55      end
  56    
  57      def self.stop(daemon)
  58        if !File.file?(daemon.pid_fn)
  59          puts "Pid file not found. Is the daemon started?"
  60          exit
  61        end
  62        pid = PidFile.recall(daemon)
  63        FileUtils.rm(daemon.pid_fn)
  64        pid && Process.kill("TERM", pid)
  65      end
  66    end
  67  end
created by henryhamon — 01 August 2008 — get a short url — tags: daemon embed