From 2a7dadc2b2fef41d93fac4a1e3889014f1b07f37 Mon Sep 17 00:00:00 2001 From: Keith Rarick Date: Mon, 20 Sep 2010 12:05:12 -0700 Subject: [PATCH] Wait cleanly for child processes to exit. Signed-off-by: David Dollar --- lib/foreman/engine.rb | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/lib/foreman/engine.rb b/lib/foreman/engine.rb index d2ddf8e..47f9646 100644 --- a/lib/foreman/engine.rb +++ b/lib/foreman/engine.rb @@ -39,8 +39,8 @@ class Foreman::Engine fork process, options end - trap("TERM") { kill_and_exit("TERM") } - trap("INT") { kill_and_exit("INT") } + trap("TERM") { kill_all("TERM") } + trap("INT") { kill_all("INT") } watch_for_termination end @@ -48,8 +48,8 @@ class Foreman::Engine def execute(name, options={}) fork processes[name], options - trap("TERM") { kill_and_exit("TERM") } - trap("INT") { kill_and_exit("INT") } + trap("TERM") { kill_all("TERM") } + trap("INT") { kill_all("INT") } watch_for_termination end @@ -97,18 +97,15 @@ private ###################################################################### rescue PTY::ChildExited, Interrupt info "process exiting", process end - Process.waitall end end - def kill_and_exit(signal="TERM") + def kill_all(signal="TERM") info "terminating" running_processes.each do |pid, process| info "killing #{process.name} in pid #{pid}" Process.kill(signal, pid) end - Process.waitall - exit 0 end def info(message, process=nil) @@ -151,7 +148,8 @@ private ###################################################################### pid, status = Process.wait2 process = running_processes.delete(pid) info "process terminated", process - kill_and_exit + kill_all + Process.waitall end def running_processes