class InstanceAgent::Runner::Master

Constants

ChildTerminationMaxWaitTime

Public Class Methods

child_class() click to toggle source
# File lib/instance_agent/runner/master.rb, line 15
def self.child_class
  ::InstanceAgent::Runner::Child
end
description(pid = $$) click to toggle source
# File lib/instance_agent/runner/master.rb, line 11
def self.description(pid = $$)
  "master #{pid}"
end
log_file() click to toggle source
# File lib/instance_agent/runner/master.rb, line 23
def self.log_file
  File.join(ProcessManager::Config.config[:log_dir], "#{ProcessManager::Config.config[:program_name]}.log")
end
pid_description() click to toggle source
# File lib/instance_agent/runner/master.rb, line 19
def self.pid_description
  ProcessManager::Config.config[:program_name]
end
pid_file() click to toggle source
# File lib/instance_agent/runner/master.rb, line 27
def self.pid_file
  File.join(ProcessManager::Config.config[:pid_dir], "#{ProcessManager::Config.config[:program_name]}.pid")
end

Public Instance Methods

kill_children(sig) click to toggle source
# File lib/instance_agent/runner/master.rb, line 60
def kill_children(sig)
      children.each do |index, child_pid|
    begin
      Process.kill(sig, child_pid)
    rescue Errno::ESRCH
    end
  end
    
  begin
    Timeout.timeout(ChildTerminationMaxWaitTime) do
      children.each do |index, child_pid|
        begin
          Process.wait(child_pid)
        rescue Errno::ESRCH
        end
      end
    end
  rescue Timeout::Error
    children.each do |index, child_pid|
      if ProcessManager.process_running?(child_pid)
        puts "Stopping #{ProcessManager::Config.config[:program_name]} agent(#{pid}) but child(#{child_pid}) still processing."
        ProcessManager::Log.warn("Stopping #{ProcessManager::Config.config[:program_name]} agent(#{pid}) but child(#{child_pid}) is still processing.")
      end
    end
  end

end
stop() click to toggle source
# File lib/instance_agent/runner/master.rb, line 31
def stop
  if (pid = self.class.find_pid)
    puts "Stopping #{description(pid)}"
    ProcessManager::Log.info("Stopping #{description(pid)}")
    begin
      Process.kill('TERM', pid)
    rescue Errno::ESRCH
    end
    
    begin
      Timeout.timeout(ChildTerminationMaxWaitTime) do  
        loop do
          begin
            Process.kill(0, pid)
            sleep(1)
          rescue Errno::ESRCH
            break
          end
        end
      end
    rescue Timeout::Error
      puts "Child processes still running. Master going down."
      ProcessManager::Log.warn("Master process (#{pid}) going down before terminating child")
    end
  else
    puts "Nothing running that could be stopped"
  end
end