[Zope-Checkins] CVS: Zope/lib/python/zdaemon - Daemon.py:1.12 SignalPasser.py:NONE

Chris McDonough chrism@zope.com
Tue, 8 Oct 2002 17:07:26 -0400


Update of /cvs-repository/Zope/lib/python/zdaemon
In directory cvs.zope.org:/tmp/cvs-serv10053/lib/python/zdaemon

Modified Files:
	Daemon.py 
Removed Files:
	SignalPasser.py 
Log Message:
Dumb bug in zdaemon fixed in which it would try to kill process numbers 1, 2, 3, 10, 12, and 15
when it caught a signal related to any of these signal numbers. ;-)  Instead, it
actually tries now to kill its child process with the same signal.

Pidfile handling improved.

When Zope is started under zdaemon, it no longer writes its own pidfile.  Instead, it passes in the path to Z2.pid to zdaemon as its pidfile name.  The 'zProcessManager.pid' file is no longer ever written.

This caused a change to the -Z option of z2.py which should be mostly backwards-compatible (unless people were relying on zProcessManager.pid to be written).  Now the -Z option is a boolean.  -Z1 means use a daemon.  -Z0 means dont.  The default is -Z1.

Write pidfiles out with trailing newlines.

Minor reorganization of "SignalPasser" code (move it from its own module into zdaemon).


=== Zope/lib/python/zdaemon/Daemon.py 1.11 => 1.12 ===
--- Zope/lib/python/zdaemon/Daemon.py:1.11	Wed Aug 14 18:12:52 2002
+++ Zope/lib/python/zdaemon/Daemon.py	Tue Oct  8 17:07:25 2002
@@ -15,13 +15,25 @@
 import os, sys, time, signal
 from ZDaemonLogging import pstamp
 import zLOG
-from SignalPasser import SignalPasser
 
 pyth = sys.executable
 
 class DieNow(Exception):
     pass
 
+class SignalPasser:
+    """ A class used for passing signal that the daemon receives along to
+    its child """
+    def __init__(self, pid):
+        self.pid = pid
+
+    def __call__(self, signum, frame):
+        # send the signal to our child
+        os.kill(self.pid, signum)
+        # we want to die ourselves if we're signaled with SIGTERM or SIGINT
+        if signum in [signal.SIGTERM, signal.SIGINT]:
+            raise DieNow
+
 def run(argv, pidfile=''):
     if os.environ.has_key('ZDAEMON_MANAGED'):
         # We're being run by the child.
@@ -42,7 +54,7 @@
                 interesting = [1, 2, 3, 10, 12, 15]
                 # ie. HUP, INT, QUIT, USR1, USR2, TERM
                 for sig in interesting:
-                    signal.signal(sig, SignalPasser(sig))
+                    signal.signal(sig, SignalPasser(pid))
                 pstamp('Houston, we have forked: pid %s' % pid, zLOG.INFO)
                 write_pidfile(pidfile)
                 p,s = wait(pid) # waitpid will block until child exit
@@ -79,7 +91,7 @@
 def write_pidfile(pidfile):
     if pidfile:
         pf = open(pidfile, 'w+')
-        pf.write(("%s" % os.getpid()))
+        pf.write(("%s\n" % os.getpid()))
         pf.close()
 
 def wait(pid):
@@ -121,8 +133,7 @@
         signame = get_signal_name(signum)
         msg = "stopped by signal %s(%s)" % (signame,
                                             signum)
-    pstamp('Aiieee! Process %s %s' % (p, msg),
-           zLOG.ERROR)
+    pstamp('Aieeee!  Process %s %s' % (p, msg), zLOG.ERROR)
 
 _signals = None
 

=== Removed File Zope/lib/python/zdaemon/SignalPasser.py ===