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