I'm suprised noone could suggest an easy way to run Zope as an NT Service, but this is so useful I thought it would be worth writing. The script below uses the service support from the win32 extensions package, at http://www.python.org/windows, although I have not tested it with the binary distributions.
Hopefully this is useful to someone else too,
Toby Dickenson
----
port=80
swhome='D:/Progra~1/Zope' python_cmd='d:/progra~1/python/python'
import sys import os import win32serviceutil import win32service import time import thread import string
sys.path.insert(0, '%s/lib/python' % swhome) sys.path.insert(1, '%s' % swhome)
import ZopeHTTPServer from ZPublisher import Client
try: access=string.split(open('%s/access'%swhome).read(),':') zope_admin_user_name=string.strip(access[0]) zope_admin_password=string.strip(access[1]) except: zope_admin_user_name="" zope_admin_password=""
def run_zope(): args = ['-p', str(port), 'BOBO_DEBUG_MODE=1', '%s/lib/python/Main.py'%swhome ] try: ZopeHTTPServer.main(args) except SystemExit: pass
def stop_zope(): url="http://localhost:%d/Control_Panel/manage_shutdown%22%port f=Client.Function(url) f.username=zope_admin_user_name f.password=zope_admin_password try: f() except: pass
class ZopeService(win32serviceutil.ServiceFramework): _svc_name_ = "OZope" _svc_display_name_ = "Zope"
def SvcStop(self): print "Stop request received" self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) # need make http rpc to zope in a different thread since we need to return from # this stop request sooner than the rpc will complete. This would not # be a problem if ZopeHTTPServer would shutdown the socket when an exception escapes thread.start_new_thread(stop_zope,())
SvcShutdown=SvcStop
def SvcDoRun(self): try: sys.stdout=sys.stderr=open("%s/service.log"%swhome,"a",0) except: pass run_zope() print "Service exiting"
if __name__=='__main__': win32serviceutil.HandleCommandLine(ZopeService)