Class: RunLoop::ProcessWaiter

Inherits:
Object
  • Object
show all
Defined in:
lib/run_loop/process_waiter.rb

Overview

A class for waiting on processes.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(process_name, options = {}) ⇒ ProcessWaiter

Returns a new instance of ProcessWaiter.



8
9
10
11
# File 'lib/run_loop/process_waiter.rb', line 8

def initialize(process_name, options={})
  @options = DEFAULT_OPTIONS.merge(options)
  @process_name = process_name
end

Instance Attribute Details

#process_nameObject (readonly)

Returns the value of attribute process_name.



6
7
8
# File 'lib/run_loop/process_waiter.rb', line 6

def process_name
  @process_name
end

Instance Method Details

#pidsArray<Integer>

Collect a list of Integer pids.

Returns:

  • (Array<Integer>)

    An array of integer pids for the ‘process_name`



15
16
17
18
19
# File 'lib/run_loop/process_waiter.rb', line 15

def pids
  process_info = `ps x -o pid,comm | grep -v grep | grep '#{process_name}'`
  process_array = process_info.split("\n")
  process_array.map { |process| process.split(' ').first.strip.to_i }
end

#running_process?Boolean

Is the ‘process_name` a running?

Returns:

  • (Boolean)


22
23
24
# File 'lib/run_loop/process_waiter.rb', line 22

def running_process?
  !pids.empty?
end

#wait_for_anyObject

Wait for ‘process_name` to start.



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/run_loop/process_waiter.rb', line 63

def wait_for_any
  return true if running_process?

  now = Time.now
  poll_until = now + @options[:timeout]
  delay = @options[:interval]
  is_alive = false
  while Time.now < poll_until
    is_alive = running_process?
    break if is_alive
    sleep delay
  end

  RunLoop.log_debug("Waited for #{Time.now - now} seconds for '#{process_name}' to start.")

  if @options[:raise_on_timeout] and !is_alive
    raise "Waited #{@options[:timeout]} seconds for '#{process_name}' to start."
  end
  is_alive
end

#wait_for_n(n) ⇒ Object

Wait for a number of process to start.

Parameters:

  • n (Integer)

    The number of processes to wait for.

Raises:

  • (ArgumentError)

    If n < 0

  • (ArgumentError)

    If n is not an Integer



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/run_loop/process_waiter.rb', line 30

def wait_for_n(n)
  unless n.is_a?(Integer)
    raise ArgumentError, "Expected #{n.class} to be #{1.class}"
  end

  unless n > 0
    raise ArgumentError, "Expected #{n} to be > 0"
  end

  return true if pids.count == n

  now = Time.now
  poll_until = now + @options[:timeout]
  delay = @options[:interval]
  there_are_n = false
  while Time.now < poll_until
    there_are_n = pids.count == n
    break if there_are_n
    sleep delay
  end

  plural = n > 1 ? "es" : ''
  RunLoop.log_debug("Waited for #{Time.now - now} seconds for #{n} '#{process_name}' process#{plural} to start.")

  if @options[:raise_on_timeout] and !there_are_n
    plural = n > 1 ? "es" : ''
    raise "Waited #{@options[:timeout]} seconds for #{n} '#{process_name}' process#{plural} to start."
  end
  there_are_n
end

#wait_for_noneObject

Wait for all ‘process_name` to finish.



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/run_loop/process_waiter.rb', line 85

def wait_for_none
  return true if !running_process?

  now = Time.now
  poll_until = now + @options[:timeout]
  delay = @options[:interval]
  has_terminated = false
  while Time.now < poll_until
    has_terminated = !self.running_process?
    break if has_terminated
    sleep delay
  end

  RunLoop.log_debug("Waited for #{Time.now - now} seconds for '#{process_name}' to die.")

  if @options[:raise_on_timeout] and !has_terminated
    raise "Waited #{@options[:timeout]} seconds for '#{process_name}' to die."
  end
  has_terminated
end