[Zope-Checkins] CVS: Zope/lib/python/nt_svcutils - service.py:1.2
Jeremy Hylton
jeremy at zope.com
Tue Jan 13 14:26:48 EST 2004
Update of /cvs-repository/Zope/lib/python/nt_svcutils
In directory cvs.zope.org:/tmp/cvs-serv18360
Modified Files:
service.py
Log Message:
Refactored, but untested.
Refactor the main SvcDoRun() method to make it a little easier to
read. Move the details of log messages to helper methods. Trim
comments that explain obvious code.
Make log messages read the same as zdaemon log messages.
=== Zope/lib/python/nt_svcutils/service.py 1.1 => 1.2 ===
--- Zope/lib/python/nt_svcutils/service.py:1.1 Wed Aug 20 10:43:16 2003
+++ Zope/lib/python/nt_svcutils/service.py Tue Jan 13 14:26:43 2004
@@ -12,8 +12,7 @@
#
##############################################################################
-""" Windows NT/2K service installer/controller for Zope/ZEO/ZRS instance
-homes """
+"""Windows Services installer/controller for Zope/ZEO/ZRS instance homes"""
import win32serviceutil
import win32service
@@ -74,10 +73,35 @@
None, cmd, None, None, 0, 0, None, None,
win32process.STARTUPINFO())
+ def logmsg(self, event):
+ # log a service event using servicemanager.LogMsg
+ from servicemanager import LogMsg
+ LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE, event,
+ (self._svc_name_, " (%s)" % self._svc_display_name_))
+
+ def info(self, s):
+ from servicemanager import LogInfoMsg
+ LogInfoMsg("%s (%s): %s" %
+ (self._svc_name_, self._svc_display_name_, s))
+
+ def warning(self, s):
+ from servicemanager import LogWarningMsg
+ LogWarningMsg("%s (%s): %s" %
+ (self._svc_name_, self._svc_display_name_, s))
+
+ def error(self, s):
+ from servicemanager import LogErrorMsg
+ LogErrorMsg("%s (%s): %s" %
+ (self._svc_name_, self._svc_display_name_, s))
+
def SvcDoRun(self):
# indicate to Zope that the process is daemon managed (restartable)
os.environ['ZMANAGED'] = '1'
+ # XXX the restart behavior is different here than it is for
+ # zdaemon.zdrun. we should probably do the same thing in both
+ # places.
+
# daemon behavior: we want to to restart the process if it
# dies, but if it dies too many times, we need to give up.
@@ -96,24 +120,14 @@
backoff_cumulative = 0
import servicemanager
-
- # log a service started message
- servicemanager.LogMsg(
- servicemanager.EVENTLOG_INFORMATION_TYPE,
- servicemanager.PYS_SERVICE_STARTED,
- (self._svc_name_, ' (%s)' % self._svc_display_name_))
+ self.logmsg(servicemanager.PYS_SERVICE_STARTED)
while 1:
start_time = time.time()
info = self.createProcess(self.start_cmd)
self.hZope = info[0] # the pid
if backoff_interval > BACKOFF_INITIAL_INTERVAL:
- # if we're in a backoff state, log a message about
- # starting a new process
- servicemanager.LogInfoMsg(
- '%s (%s): recovering from died process, new process '
- 'started' % (self._svc_name_, self._svc_display_name_)
- )
+ self.info("created process")
rc = win32event.WaitForMultipleObjects(
(self.hWaitStop, self.hZope), 0, win32event.INFINITE)
if rc == win32event.WAIT_OBJECT_0:
@@ -129,51 +143,26 @@
# interface (or it otherwise exited cleanly)
break
else:
- # this was an abormal shutdown. if we can, we want to
- # restart the process but if it seems hopeless,
- # don't restart an infinite number of times.
+ # this was an abormal shutdown.
if backoff_cumulative > BACKOFF_MAX:
- # it's hopeless
- servicemanager.LogErrorMsg(
- '%s (%s): process could not be restarted due to max '
- 'restart attempts exceeded' % (
- self._svc_display_name_, self._svc_name_
- ))
+ self.error("restarting too frequently; quit")
self.SvcStop()
break
- servicemanager.LogWarningMsg(
- '%s (%s): process died unexpectedly. Will attempt '
- 'restart after %s seconds.' % (
- self._svc_name_, self._svc_display_name_,
- backoff_interval
- )
- )
- # if BACKOFF_CLEAR_TIME seconds have elapsed since we last
- # started the process, reset the backoff interval
- # and the cumulative backoff time to their original
- # states
+ self.warning("sleep %s to avoid rapid restarts"
+ % backoff_interval)
if time.time() - start_time > BACKOFF_CLEAR_TIME:
backoff_interval = BACKOFF_INITIAL_INTERVAL
backoff_cumulative = 0
- # we sleep for the backoff interval. since this is async
- # code, it would be better done by sending and
- # catching a timed event (a service
- # stop request will need to wait for us to stop sleeping),
- # but this works well enough for me.
+ # XXX Since this is async code, it would be better
+ # done by sending and catching a timed event (a
+ # service stop request will need to wait for us to
+ # stop sleeping), but this works well enough for me.
time.sleep(backoff_interval)
- # update backoff_cumulative with the time we spent
- # backing off.
- backoff_cumulative = backoff_cumulative + backoff_interval
- # bump the backoff interval up by 2* the last interval
- backoff_interval = backoff_interval * 2
-
- # loop and try to restart the process
-
- # log a service stopped message
- servicemanager.LogMsg(
- servicemanager.EVENTLOG_INFORMATION_TYPE,
- servicemanager.PYS_SERVICE_STOPPED,
- (self._svc_name_, ' (%s) ' % self._svc_display_name_))
+ backoff_cumulative += backoff_interval
+ backoff_interval *= 2
+
+
+ self.logmsg(servicemanager.PYS_SERVICE_STOPPED)
-if __name__=='__main__':
+if __name__ == '__main__':
win32serviceutil.HandleCommandLine(Service)
More information about the Zope-Checkins
mailing list