how to make a python windows service know it's own identity

Chris Mellon arkanes at gmail.com
Thu Feb 1 14:34:37 EST 2007


On 1 Feb 2007 11:24:13 -0800, Chris Curvey <ccurvey at gmail.com> wrote:
> On Feb 1, 2:10 pm, Larry Bates <larry.ba... at websafe.com> wrote:
> > Chris Curvey wrote:
> > > Hi all,
> >
> > > I have used the win32com libraries to set up a service called
> > > MyService under Windows.  So far, so good.  Now I need to run multiple
> > > copies of the service on the same machine.  I also have that working.
> > > For monitoring and logging, I'd like each instance of the service to
> > > know it's own identity (MyService1, MyService2, etc.)
> >
> > > But I can't quite seem to grasp how to do this.  In the code below,
> > > the command line parameter "-i" gives the service an identity, but how
> > > do I get the service to understand it's identity when it is started?
> >
> > > Many thanks!
> >
> > > class MyService(win32serviceutil.ServiceFramework):
> > >     """NT Service."""
> >
> > >     _svc_name_ = "MyService"
> > >     _svc_display_name_ = "My Service"
> >
> > >     _id_ = ''
> >
> > >     def SvcDoRun(self):
> > >         provider = MyServiceClass(identifier=self._id_)
> > >         provider.start()
> >
> > >         # now, block until our event is set...
> > >         win32event.WaitForSingleObject(self.stop_event,
> > > win32event.INFINITE)
> >
> > >    # __init__ and SvcStop snipped
> >
> > > ###########################################################################
> > > if __name__ == '__main__':
> > >     import optparse
> > >     parser = optparse.OptionParser()
> > >     parser.add_option("-i", "--identifier", dest="identifier")
> > >     (opts, args) = parser.parse_args()
> > >     if opts.number is not None:
> > >         MyService._svc_name_ += opts.identifier
> > >         MyService._svc_display_name_ += opts.identifier
> > >         MyService._provider_id_ = opts.identifier
> >
> > >     win32serviceutil.HandleCommandLine(MyService,
> > > customInstallOptions="i:")
> >
> > What is your use case for this?  Why not make a single server
> > process multiple providers (store them in a list or other
> > container)?
> >
> > -Larry Bates
>
> The use case is that I have a queue of jobs that need to run.  My
> service connects to a central "distributor" server, which hands out
> jobs to complete.  I'd like to be able to run multiple copies of the
> distributed service so that I can make the most use of each machine
> where they run.  (I'm not certain of the thread safety of some of the
> libraries I'm using, so I'm leery of going the multi-threaded route)
> Anyway, when my service gets a job to process, I'd like to know which
> copy of the service is working on which job.  So I want my log
> messages to look like this:
>
> Job 123:  Host: alpha  Service: MyService A
> Job 124:  Host: alpha  Service: MyService B
> Job 124:  Host: beta  Service: MyService C
>
> Is that clear, or have I muddied the waters?
>

Windows services are identified by name, so if you're running multiple
services they will need to have unique _svc_name members.



More information about the Python-list mailing list