Sha256: 160bfc8c8c85f6348a9edce6663aeb2fbd86d83df50004585b833685bface8de

Contents?: true

Size: 1.33 KB

Versions: 2

Compression:

Stored size: 1.33 KB

Contents

# frozen_string_literal: true

module Nonnative
  class Process < Runner
    def initialize(service)
      super service

      @timeout = Nonnative::Timeout.new(service.timeout)
    end

    def start
      unless process_exists?
        proxy.start
        @pid = process_spawn
        wait_start
      end

      pid
    end

    def stop
      if process_exists?
        process_kill
        proxy.stop
        wait_stop
      end

      pid
    end

    def memory
      return if pid.nil?

      @memory ||= GetProcessMem.new(pid)
    end

    protected

    def wait_stop
      timeout.perform do
        ::Process.waitpid2(pid)
      end
    end

    private

    attr_reader :pid, :timeout

    def process_kill
      signal = Signal.list[service.signal || 'INT'] || Signal.list['INT']
      ::Process.kill(signal, pid)
    end

    def process_spawn
      environment = service.environment || {}
      environment = environment.transform_keys(&:to_s).transform_values(&:to_s)

      environment.each_key do |k|
        environment[k] = ENV[k] || environment[k]
      end

      spawn(environment, service.command, %i[out err] => [service.log, 'a'])
    end

    def process_exists?
      return false if pid.nil?

      signal = Signal.list['EXIT']
      ::Process.kill(signal, pid)
      true
    rescue Errno::ESRCH
      false
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
nonnative-1.57.0 lib/nonnative/process.rb
nonnative-1.56.1 lib/nonnative/process.rb