Commands added using this method will only be considered successful if their exit status is 0.
Use add if successful exit status codes need to be specified.
# File lib/backup/pipeline.rb, line 34 def <<(command) add(command, [0]) end
Adds a command to be executed in the pipeline. Each command will be run in the order in which it was added, with it’s output being piped to the next command.
success_codes must be an Array of Integer exit codes that will be considered successful for the command.
# File lib/backup/pipeline.rb, line 24 def add(command, success_codes) @commands << command @success_codes << success_codes end
Returns a multi-line String, reporting all STDERR messages received from the commands in the pipeline (if any), along with the SystemCallError (Errno) message for each command which had a non-zero exit status.
# File lib/backup/pipeline.rb, line 79 def error_messages @error_messages ||= (stderr_messages || '') + "The following system errors were returned:\n" + @errors.map {|err| "#{ err.class }: #{ err.message }" }.join("\n") end
Runs the command line from `pipeline` and collects STDOUT/STDERR. STDOUT is then parsed to determine the exit status of each command. For each command with a non-zero exit status, a SystemCallError is created and added to @errors. All STDERR output is set in @stderr.
Note that there is no accumulated STDOUT from the commands themselves. Also, the last command should not attempt to write to STDOUT. Any output on STDOUT from the final command will be sent to STDERR. This in itself will not cause run to fail, but will log warnings when all commands exit with non-zero status.
Use `success?` to determine if all commands in the pipeline succeeded. If `success?` returns `false`, use `error_messages` to get an error report.
# File lib/backup/pipeline.rb, line 52 def run Open4.popen4(pipeline) do |pid, stdin, stdout, stderr| pipestatus = stdout.read.gsub("\n", '').split(':').sort pipestatus.each do |status| index, exitstatus = status.split('|').map(&:to_i) unless @success_codes[index].include?(exitstatus) command = command_name(@commands[index]) @errors << SystemCallError.new( "'#{ command }' returned exit code: #{ exitstatus }", exitstatus ) end end @stderr = stderr.read.strip end Logger.warn(stderr_messages) if success? && stderr_messages rescue Exception => err raise Error.wrap(err, 'Pipeline failed to execute') end
Generated with the Darkfish Rdoc Generator 2.