about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2009-04-13 13:09:05 -0700
committerEric Wong <normalperson@yhbt.net>2009-04-13 13:50:23 -0700
commit8762b78d1b44b50092a8cbfc22e31bf611612a73 (patch)
treec64dfc95272cee55c36f64a1ba33d55eff30381b
parent943f9ff1a04eb1c0e494bd74b269d3e93e809a98 (diff)
downloadunicorn-8762b78d1b44b50092a8cbfc22e31bf611612a73.tar.gz
By reraising SignalException in workers.  Since we just rely on
default signal handlers for the majority of signals now, ensure
those signals actually exit the process.
-rw-r--r--lib/unicorn.rb4
-rw-r--r--test/exec/test_exec.rb16
2 files changed, 18 insertions, 2 deletions
diff --git a/lib/unicorn.rb b/lib/unicorn.rb
index 4465109..bb4054a 100644
--- a/lib/unicorn.rb
+++ b/lib/unicorn.rb
@@ -521,8 +521,8 @@ module Unicorn
               reopen_logs or exit(alive ? 1 : 0)
             end
           end
-        rescue SystemExit => e
-          exit(e.status)
+        rescue SignalException, SystemExit => e
+          raise e
         rescue Object => e
           if alive
             logger.error "Unhandled listen loop exception #{e.inspect}."
diff --git a/test/exec/test_exec.rb b/test/exec/test_exec.rb
index 596ab88..8780da0 100644
--- a/test/exec/test_exec.rb
+++ b/test/exec/test_exec.rb
@@ -72,6 +72,22 @@ end
     end
   end
 
+  def test_exit_signals
+    %w(INT TERM QUIT).each do |sig|
+      File.open("config.ru", "wb") { |fp| fp.syswrite(HI) }
+      pid = xfork { redirect_test_io { exec($unicorn_bin, "-l#@addr:#@port") } }
+      wait_master_ready("test_stderr.#{pid}.log")
+      status = nil
+      assert_nothing_raised do
+        Process.kill(sig, pid)
+        pid, status = Process.waitpid2(pid)
+      end
+      reaped = File.readlines("test_stderr.#{pid}.log").grep(/reaped/)
+      assert_equal 1, reaped.size
+      assert status.exited?
+    end
+  end
+
   def test_basic
     File.open("config.ru", "wb") { |fp| fp.syswrite(HI) }
     pid = fork do