Sha256: 77bb5ab93f509591d16b771c624d729c4ca82b173a6d386f7ee86a45b9434b13

Contents?: true

Size: 1.17 KB

Versions: 1

Compression:

Stored size: 1.17 KB

Contents

require 'nutcracker/version'
require 'socket'
require 'json'

module Nutcracker

  def self.start options
    Nutcracker::Process.new(options).start
  end

  def self.executable
    File.expand_path("../../ext/nutcracker/src/nutcracker", __FILE__)
  end

  def self.version
    Nutcracker::VERSION
  end

  class Process
    attr_reader :pid, :options

    def initialize options
      @options = options
    end

    def start
      raise RuntimeError, "Nutcracker is already running (#{pid})..." if running?
      @pid = ::Process.spawn("#{Nutcracker.executable} -c #{options.fetch(:config_file).inspect}")
      Kernel.at_exit { stop if running? }
      self
    end

    def running?
      !!(pid and ::Process.getpgid pid rescue false)
    end

    def stop
      signal :TERM
    end

    def kill
      signal :KILL
    end

    def join
      verify_running! and ::Process.waitpid2 pid
    end

    def stats
      JSON.parse TCPSocket.new('localhost',22222).read rescue {}
    end

    private

    def verify_running!
      running? or raise RuntimeError, "Nutcracker isn't running..." 
    end

    def signal term
      verify_running! and ::Process.kill(term, pid)
    end

  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
nutcracker-0.2.4.2 lib/nutcracker.rb