diff --git a/lib/resqued/listener_proxy.rb b/lib/resqued/listener_proxy.rb
index <HASH>..<HASH> 100644
--- a/lib/resqued/listener_proxy.rb
+++ b/lib/resqued/listener_proxy.rb
@@ -13,6 +13,14 @@ module Resqued
       @options = options
     end
 
+    # Public: wrap up all the things, this object is going home.
+    def dispose
+      if @master_socket
+        @master_socket.close
+        @master_socket = nil
+      end
+    end
+
     # Public: An IO to select on to check if there is incoming data available.
     def read_pipe
       @master_socket
@@ -80,6 +88,7 @@ module Resqued
 
     # Public: Report that a worker finished.
     def worker_finished(pid)
+      return if @master_socket.nil?
       @master_socket.puts(pid)
     end
   end
diff --git a/lib/resqued/master.rb b/lib/resqued/master.rb
index <HASH>..<HASH> 100644
--- a/lib/resqued/master.rb
+++ b/lib/resqued/master.rb
@@ -119,7 +119,7 @@ module Resqued
             @listener_backoff.finished
             @current_listener = nil
           end
-          listener_pids.delete(lpid) # This may leak workers.
+          listener_pids.delete(lpid).dispose # This may leak workers.
           write_procline
         else
           return
Clean up some of the listener's details.