[Zope-dev] Re: Possible Windows Service improvements.
Tres Seaver
tseaver at zope.com
Thu Aug 12 09:48:12 EDT 2004
Mark Hammond wrote:
>>Would a lockfile work ok to signify "running" state? IOW, Zope would
>>lock a file as one of the last steps during startup (which it actually
>>does now, but might do it a bit too early). The Windows
>>service manager
>>would attempt to lock the same file after <timeout> seconds (although
>>I'm not sure where to get <timeout> from) on initial startup.
>
>
>>If the file doesn't exist or the lock succeeds, the process is
>>nonrestartable.
>>If it exists and cannot be locked (Zope has locked it, signifying
>>successful startup), the process is restartable.
>
>
> This lets the parent know of successful startup, but doesn't help it during
> the 'starting' phase (if the lock never gets set, how long do we wait before
> giving up?) Ditto for shutdown - after requesting the child shutdown, how
> long do we wait for it to terminate?
>
> A single timeout leaves us where we started - it is too fragile to assume
> that if the app has not started after x seconds, it never will. By having
> the child actively report progress, the parent process can be more confident
> it is alive and normal, even if it is taking a very long time to start.
>
> Wouldn't a socket work? As the parent process is starting the child, it
> could pass the port on the cmdline.
>
> I think by *describing* the API, I made it sound more complicated than it
> is. It consists of 2 functions:
>
> def reportState(state, timeout, error_info = None):
> """Called by the child process, and implemented by the parent.
> Reports the status of the child process to the parent.
>
> state may be 'starting', 'running', 'stopping', 'stopped',
> 'pausing' or 'paused'.
>
> timeout is how long before the parent will consider us dead
> if we don't report progress again.
>
> error_info may be specified as the program reports 'stopped'.
> If None, the shutdown was normal.
> """
>
> # This second one is optional, but abstracts away using signals :)
> def changeState(new_state):
> """Called by the parent process, and implemented by the child.
> Requests that the client process enter the specified state.
> Only 'running', 'stopped' and 'paused' are valid (ie, the
> parent must never request any of the transition states)
> """
>
> If we ignore the second and stick to signals, it seems fairly robust and
> achievable.
>
> The other option is that we get rid of the 'parent' service all together.
> Just have the service code use run.py directly, and run it in-process. The
> Windows builtin 'auto-restart' facilities for services can handle the
> bizarre errors, and offers the benefit of allowing the user to define the
> restart policy (even allowing them to reboot should it go down <wink>).
> There may be good reasons for that though.
I still think we should look at making a Windwos version of the
'zdaemon' handler, which uses a Unix-domain socket between parent and
child: we could either use a named pipe on Windows, or else a socket on
localhost, to achieve the same ends.
This would have the upside that 'zopectl' would work the same way on
windows, as well, which would be a boon for WIndows-based developers.
Tres.
--
===============================================================
Tres Seaver tseaver at zope.com
Zope Corporation "Zope Dealers" http://www.zope.com
More information about the Zope-Dev
mailing list