class Shoryuken::Runner

Public Instance Methods

healthy?() click to toggle source
# File lib/shoryuken/runner.rb, line 55
def healthy?
  (@launcher && @launcher.healthy?) || false
end
run(options) click to toggle source
# File lib/shoryuken/runner.rb, line 18
def run(options)
  self_read, self_write = IO.pipe

  %w[INT TERM USR1 TSTP TTIN].each do |sig|
    begin
      trap sig do
        self_write.puts(sig)
      end
    rescue ArgumentError
      puts "Signal #{sig} not supported"
    end
  end

  loader = EnvironmentLoader.setup_options(options)

  daemonize(Shoryuken.options)
  write_pid(Shoryuken.options)

  loader.load

  initialize_concurrent_logger

  @launcher = Shoryuken::Launcher.new

  begin
    @launcher.start

    while (readable_io = IO.select([self_read]))
      signal = readable_io.first[0].gets.strip
      handle_signal(signal)
    end
  rescue Interrupt
    @launcher.stop!
    exit 0
  end
end

Private Instance Methods

daemonize(options) click to toggle source
# File lib/shoryuken/runner.rb, line 69
def daemonize(options)
  return unless options[:daemon]

  files_to_reopen = []
  ObjectSpace.each_object(File) do |file|
    files_to_reopen << file unless file.closed?
  end

  Process.daemon(true, true)

  files_to_reopen.each do |file|
    begin
      file.reopen file.path, 'a+'
      file.sync = true
    rescue ::Exception
    end
  end

  [$stdout, $stderr].each do |io|
    File.open(options[:logfile], 'ab') do |f|
      io.reopen(f)
    end
    io.sync = true
  end
  $stdin.reopen('/dev/null')
end
execute_soft_shutdown() click to toggle source
# File lib/shoryuken/runner.rb, line 102
def execute_soft_shutdown
  logger.info { 'Received USR1, will soft shutdown down' }

  @launcher.stop
  exit 0
end
execute_terminal_stop() click to toggle source
# File lib/shoryuken/runner.rb, line 109
def execute_terminal_stop
  logger.info { 'Received TSTP, will stop accepting new work' }

  @launcher.stop
end
handle_signal(sig) click to toggle source
# File lib/shoryuken/runner.rb, line 126
def handle_signal(sig)
  logger.debug "Got #{sig} signal"

  case sig
  when 'USR1' then execute_soft_shutdown
  when 'TTIN' then print_threads_backtrace
  when 'TSTP' then execute_terminal_stop
  when 'TERM', 'INT'
    logger.info { "Received #{sig}, will shutdown" }

    raise Interrupt
  end
end
initialize_concurrent_logger() click to toggle source
# File lib/shoryuken/runner.rb, line 61
def initialize_concurrent_logger
  return unless Shoryuken.logger

  Concurrent.global_logger = lambda do |level, progname, msg = nil, &block|
    Shoryuken.logger.log(level, msg, progname, &block)
  end
end
print_threads_backtrace() click to toggle source
write_pid(options) click to toggle source
# File lib/shoryuken/runner.rb, line 96
def write_pid(options)
  return unless (path = options[:pidfile])

  File.open(path, 'w') { |f| f.puts(Process.pid) }
end