class MultiDaemons::Daemon

Constants

KILL_TIMEOUT

Attributes

daemon[RW]
errors[RW]
multiple[RW]
name[RW]
options[RW]
type[RW]

Public Class Methods

new(daemon, name:, type:, options: {}) click to toggle source
# File lib/multi_daemons/daemon.rb, line 6
def initialize(daemon, name:, type:, options: {})
  @daemon   = daemon
  @name     = name
  @type     = type
  @options  = options
  raise unless Validate.valid_daemon?(self)
end

Public Instance Methods

pid_file() click to toggle source
# File lib/multi_daemons/daemon.rb, line 52
def pid_file
  "#{pid_dir}#{name}.pid"
end
pids() click to toggle source
# File lib/multi_daemons/daemon.rb, line 48
def pids
  PidStore.get(pid_file)
end
start() click to toggle source
# File lib/multi_daemons/daemon.rb, line 14
def start
  case type
  when :proc, 'proc'
    safe_fork do
      daemon.call
    end
  when :script, 'script'
    safe_fork do
      Kernel.exec(daemon)
    end
  else
    Log.log 'Unsupported type'
  end
end
stop() click to toggle source
# File lib/multi_daemons/daemon.rb, line 29
def stop
  if File.file?(pid_file)
    pids.each do |pid|
      begin
        Process.kill('TERM', pid)
      rescue Errno::ESRCH => e
        Log.log "#{e} #{pid}"
      end
    end

    return if multiple

    Pid.force_kill(pids, options[:force_kill_timeout])
    PidStore.cleanup(pid_file)
  else
    Log.log 'Pid file not found. Is daemon running?'
  end
end

Private Instance Methods

log_dir() click to toggle source
# File lib/multi_daemons/daemon.rb, line 90
def log_dir
  return '' if options[:log_dir].to_s.empty?

  options[:log_dir][-1] == '/' ? options[:log_dir] : "#{options[:log_dir]}/"
end
log_file() click to toggle source
# File lib/multi_daemons/daemon.rb, line 58
def log_file
  "#{log_dir}#{name}.log"
end
pid_dir() click to toggle source
# File lib/multi_daemons/daemon.rb, line 96
def pid_dir
  return '' if options[:pid_dir].to_s.empty?

  options[:pid_dir][-1] == '/' ? options[:pid_dir] : "#{options[:pid_dir]}/"
end
process_fork() { || ... } click to toggle source
# File lib/multi_daemons/daemon.rb, line 62
def process_fork
  begin
    Process.setsid

    $0 = name || $PROGRAM_NAME

    PidStore.store(pid_file, Process.pid)

    log = File.new(log_file, 'a')
    STDIN.reopen '/dev/null'
    STDOUT.reopen log
    STDERR.reopen STDOUT
    STDOUT.sync = true

    yield if block_given?
  rescue Exception => e
    Log.log e.message
    Log.log e.backtrace
    ErrorReporter.report(e, class: self.class.name, name: name, type: type, options: options)
  end
end
safe_fork(&block) click to toggle source
# File lib/multi_daemons/daemon.rb, line 84
def safe_fork(&block)
  Process.fork do
    process_fork(&block)
  end
end