I'm trying to setup an application that runs as a Windows service to rotate logs upon receiving a certain signal.  Whenever I try to do this I get the following error.
Exception in TestService.SvcStart: signal only works in main thread
Attached is a very trimmed down example.  To run the example and see the error message, do the following.
  1. In one DOS window run PYTHONHOME\Lib\site-packages\win32\lib\win32traceutil.py to begin collecting trace output.
  2. In a separate DOS window run "python tsvc.py --username domain\user --password yourpassword --startup auto install" using your own user and password.
  3. Using Start > Control Panel > Administrative Tools > Services, modify the service properties, modifying the user and password again (even though you already specified them) and click OK.  Accept any prompts about granting the appropriate rights to run as a service.
  4. Run "net start tsvc"
  5. Observe the error in the win32traceutil window.
I realize this is a known problem but am unsure how to get around it to make sure my log rotation works when receiving the signal.  Does anyone have any ideas on how to get around this limitation?
 
Thanks.
Justin
import win32serviceutil
import win32service
import sys
import os

SVC_NAME = "tsvc"
SVC_DISPLAY_NAME = "Test Service"

class TestService(win32serviceutil.ServiceFramework):

    _svc_name_ = SVC_NAME
    _svc_display_name_ = SVC_DISPLAY_NAME

    def SvcDoRun(self):
        ## Import inside the method, so we redirect all output
        ## to the trace output collector.  If you need to debug this service,
        ## run win32traceutil.py as a script.  It will receive all output from
        ## this service.
        import win32traceutil
        try:
            import signal
            SIGUSR1 = 10 # Windows doesn't care what the number is
            def rotateLog(signal, frame):
                pass
            signal.signal(SIGUSR1, rotateLog)
        except Exception, e:
            print "Exception in TestService.SvcStart:", str(e)


    def SvcStop(self):
        ## See above for why we import this.
        import win32traceutil
        try:
            self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        except Exception, e:
            print "Exception in TestService.SvcStop:", str(e)


if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(TestService)






_______________________________________________
Python-win32 mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-win32

Reply via email to