Sha256: 7f9a7525f2bd230a923c7b2852518546437c28bb72095836a4efde525490b616

Contents?: true

Size: 1.67 KB

Versions: 2

Compression:

Stored size: 1.67 KB

Contents

module Capricorn
  module Daemon
    class Base
      
      def self.daemonize(&block)
        Capricorn::Daemon::Controller.start(self,&block)
      end
      
    end
  
    module PidFile
      def self.store(pid)
        File.open(self.pid_file, 'w') {|f| f << pid}
      end
  
      def self.recall
        IO.read(self.pid_file).to_i rescue nil
      end
      
      def self.destroy
        FileUtils.rm(self.pid_file) if self.exist?
      end
      
      def self.pid_file
        Capricorn.system.path("Server.pid")
      end
      
      def self.exist?
        File.file?(self.pid_file)
      end
    end
  
    module Controller
      
      def self.start(daemon, &block)
        fork do
          Process.setsid
          exit if fork
          if PidFile.exist?
            puts "Pid file #{PidFile.pid_file} already exists. Not starting."
            exit 1
          end
          Capricorn::Daemon::PidFile.store(Process.pid)
          Dir.chdir Capricorn.system.root
          File.umask 0000
          
          Capricorn::ExceptionHandler.redirect_std
          
          trap("TERM") { daemon.stop; exit }
          at_exit { Capricorn::Daemon::PidFile.destroy if $master }
          at_exit(&block) if block
          daemon.start
        end
        puts "Daemon started."
      end
      
      def self.stop
        if !Capricorn::Daemon::PidFile.exist?
          puts "Pid file not found. Is the daemon started?"
          exit
        end
        pid = Capricorn::Daemon::PidFile.recall
        pid && Process.kill("TERM", pid)
      rescue Errno::ESRCH
        puts "Pid file found, but process was not running. The daemon may have died."
      end
      
    end
  end
end

Version data entries

2 entries across 2 versions & 2 rubygems

Version Path
simonmenke-capricorn-0.2.00 lib/capricorn/daemon.rb
capricorn-0.2.00 lib/capricorn/daemon.rb