Am 24.10.2012 14:14, schrieb Phil Mayers: > n 24/10/12 12:33, Michael Schlenker wrote: >> Am 24.10.2012 11:01, schrieb Phil Mayers: >>> On 10/24/2012 08:43 AM, John Aherne wrote: >> >> But what you are talking about is the SetConsoleCtrlHandler function. >> http://docs.activestate.com/activepython/2.4/pywin32/win32api__SetConsoleCtrlHandler_meth.html >> >> http://msdn.microsoft.com/en-us/library/windows/desktop/ms686016%28v=vs.85%29.aspx >> >> >> Thats relevant if your process has a console, e.g. is not a GUI app. >> (pythonw.exe vs. python.exe). If you run as a GUI app you might get a >> WM_QUERYENDSESSION or similar message. >> >> You get a CTRL_LOGOFF_EVENT when a user on the machine logs off and you >> run as a subprocess of a service and need to ignore it. The service >> itself should deal with this already. > > Interesting. > > I've just looked over the code we've got. It actually does something > rather more involved than I'd first thought. Specifcally, the "ntsvc.py" > code is pure-python, no Twisted. It actually runs the Twisted daemon as > a sub-process, like this: > > import os > > class MyService(win32serviceutil.ServiceFramework): > """NT Service.""" > > _svc_name_ = "opimport-wrap" > _svc_display_name_ = "Marval opimport wrapper" > > def SvcDoRun(self): > self.childServer = Popen([ > "c:/python25/pythonw.exe",SCRIPT,"svc" > ]) > self.childServer.wait() this looks dubious, are you sure you can still react to ServiceManager actions like 'Stop' or 'Query' this way, isn't this wait() blocking?
> > My memory is hazy on this, but if I recall correctly the main reason it > works this way is that I can execute the twisted script directly from > the console (for debugging) or via the service wrapper. > > Are you suggesting that if I change that subprocess to use "python.exe" > versus "pythonw.exe" I would not need to disable the signal handlers? > Won't probably help, not sure though. If you ever import the 'time' module, as Python registers a control handler there, to allow time.sleep() to wake up when ctrl-c is pressed or the system shuts down, so i assume it has a console anyway. from timemodule.c #ifdef MS_WINDOWS /* Helper to allow interrupts for Windows. If Ctrl+C event delivered while not sleeping it will be ignored. */ main_thread = PyThread_get_thread_ident(); hInterruptEvent = CreateEvent(NULL, TRUE, FALSE, NULL); SetConsoleCtrlHandler( PyCtrlHandler, TRUE); #endif /* MS_WINDOWS */ The usual workaround to keep a service subprocess with a console alive is to simply register your own ConsoleHandler to override the default (which is ExitProcess()) and return TRUE, so the default handler doesn't run. If you spawn a lot of subprocess (around 100 at a time) you will additionally have fun with random crashes once you hit the DesktopHeap Memory limit. Michael -- Michael Schlenker Software Architect CONTACT Software GmbH Tel.: +49 (421) 20153-80 Wiener Straße 1-3 Fax: +49 (421) 20153-41 28359 Bremen http://www.contact.de/ E-Mail: m...@contact.de Sitz der Gesellschaft: Bremen Geschäftsführer: Karl Heinz Zachries, Ralf Holtgrefe Eingetragen im Handelsregister des Amtsgerichts Bremen unter HRB 13215 _______________________________________________ Twisted-Python mailing list Twisted-Python@twistedmatrix.com http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python