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