6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
# File 'lib/climatic/processes/synchronous.rb', line 6
def execute
self.exit_status = nil
self.last_pid = nil
self.process_state = :running
self.start_time = Time.now
Open3.popen3(command) do |stdin, stdout, stderr, wait_thread|
stdin.close
self.last_pid = wait_thread.pid
begin
monitored_streams = [stdout, stderr]
loop do
begin
readables, writables = IO.select(monitored_streams)
writables.each(&:close)
readables.each do |io|
begin
buffer = ''
buffer << io.read_nonblock(1) while buffer[-1] != "\n"
report buffer, io == stdout
rescue IO::WaitReadable
next
rescue EOFError => e
monitored_streams.delete io
monitored_streams.empty? ? raise(e) : next
end
end
rescue EOFError
report "End of process #{wait_thread.value.pid}"
break
end
end
rescue Errno::EAGAIN
retry
end
self.exit_status = wait_thread.value
return self.exit_status
end
ensure
self.end_time = Time.now
self.process_state = :terminated
end
|