Class: RunLoop::ProcessWaiter
- Inherits:
-
Object
- Object
- RunLoop::ProcessWaiter
- Defined in:
- lib/run_loop/process_waiter.rb
Overview
A class for waiting on processes.
Instance Attribute Summary collapse
-
#process_name ⇒ Object
readonly
Returns the value of attribute process_name.
Instance Method Summary collapse
-
#initialize(process_name, options = {}) ⇒ ProcessWaiter
constructor
A new instance of ProcessWaiter.
-
#pids ⇒ Array<Integer>
Collect a list of Integer pids.
-
#running_process? ⇒ Boolean
Is the ‘process_name` a running?.
-
#wait_for_any ⇒ Object
Wait for ‘process_name` to start.
-
#wait_for_n(n) ⇒ Object
Wait for a number of process to start.
-
#wait_for_none ⇒ Object
Wait for all ‘process_name` to finish.
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 = DEFAULT_OPTIONS.merge() @process_name = process_name end |
Instance Attribute Details
#process_name ⇒ Object (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
#pids ⇒ Array<Integer>
Collect a list of Integer pids.
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?
22 23 24 |
# File 'lib/run_loop/process_waiter.rb', line 22 def running_process? !pids.empty? end |
#wait_for_any ⇒ Object
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.
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_none ⇒ Object
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 |