summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordanielsdeleo <dan@opscode.com>2013-11-04 11:29:30 -0800
committerdanielsdeleo <dan@opscode.com>2013-11-04 11:29:30 -0800
commited33d34fec6ed1bf2400500f4330a7fb4fb871cb (patch)
treef8f3f90b96ad7eb65fae5e164ae70bb58cf05e68
parent4ff2d130c3d6e68a30340175b5ce0b164ce26220 (diff)
downloadmixlib-shellout-ed33d34fec6ed1bf2400500f4330a7fb4fb871cb.tar.gz
Add termination info to error messages
If no logger is configured, we still want to inform the user that the process was killed (and how).
-rw-r--r--lib/mixlib/shellout.rb2
-rw-r--r--lib/mixlib/shellout/unix.rb4
-rw-r--r--spec/mixlib/shellout_spec.rb2
3 files changed, 6 insertions, 2 deletions
diff --git a/lib/mixlib/shellout.rb b/lib/mixlib/shellout.rb
index a267162..66faa40 100644
--- a/lib/mixlib/shellout.rb
+++ b/lib/mixlib/shellout.rb
@@ -154,6 +154,7 @@ module Mixlib
@environment = DEFAULT_ENVIRONMENT
@cwd = nil
@valid_exit_codes = [0]
+ @terminate_reason = nil
if command_args.last.is_a?(Hash)
parse_options(command_args.pop)
@@ -191,6 +192,7 @@ module Mixlib
# results when the command exited with an unexpected status.
def format_for_exception
msg = ""
+ msg << "#{@terminate_reason}\n" if @terminate_reason
msg << "---- Begin output of #{command} ----\n"
msg << "STDOUT: #{stdout.strip}\n"
msg << "STDERR: #{stderr.strip}\n"
diff --git a/lib/mixlib/shellout/unix.rb b/lib/mixlib/shellout/unix.rb
index 2ffa5cd..15ead60 100644
--- a/lib/mixlib/shellout/unix.rb
+++ b/lib/mixlib/shellout/unix.rb
@@ -67,7 +67,7 @@ module Mixlib
# read anything it wrote when we killed it
attempt_buffer_read
# raise
- raise CommandTimeout, "command timed out:\n#{format_for_exception}"
+ raise CommandTimeout, "Command timed out after #{@execution_time.to_i}s:\n#{format_for_exception}"
end
end
@@ -302,10 +302,12 @@ module Mixlib
def reap_errant_child
return if attempt_reap
+ @terminate_reason = "Command execeded allowed execution time, killed by TERM signal."
logger.error("Command execeded allowed execution time, sending TERM") if logger
Process.kill(:TERM, @child_pid)
sleep 3
return if attempt_reap
+ @terminate_reason = "Command execeded allowed execution time, did not respond to TERM. Killed by KILL signal."
logger.error("Command did not exit from TERM, sending KILL") if logger
Process.kill(:KILL, @child_pid)
reap
diff --git a/spec/mixlib/shellout_spec.rb b/spec/mixlib/shellout_spec.rb
index fa0ee51..71ecfef 100644
--- a/spec/mixlib/shellout_spec.rb
+++ b/spec/mixlib/shellout_spec.rb
@@ -869,7 +869,7 @@ describe Mixlib::ShellOut do
let(:logger) { Logger.new(log_output) }
let(:options) { {:timeout => 1, :logger => logger} }
- it "should log messages about killing the child process", :focus do
+ it "should log messages about killing the child process" do
# note: let blocks don't correctly memoize if an exception is raised,
# so can't use executed_cmd
lambda { shell_cmd.run_command}.should raise_error(Mixlib::ShellOut::CommandTimeout)