[Python-ideas] Draft PEP: Standard daemon process library

Trent Nelson python-ideas-list at trentnelson.com
Wed Jan 28 04:03:53 CET 2009


On Wed, Jan 28, 2009 at 01:15:41PM +1100, Ben Finney wrote:
> Trent Nelson writes:
> 
> > On Wed, Jan 28, 2009 at 08:18:51AM +1100, Ben Finney wrote:
> > > Jesse Noller writes:
> > > 
> > > > I think adding the windows services functionality distracts from
> > > > the reasonable goal of the PEP Ben is proposing.
> > > 
> > > Thanks, this is my position also.
> > 
> > I disagree. Partly because I'm in a bit of a devil's advocate mood
> > at the moment. But mostly because I know what will happen: [???]
> 
> I respectfully suggest that this isn't true, because your hypothetical
> situation continues:
> 
> > After poking around the source, I'm perplexed. It's not doing
> > anything uniquely Unix-xy,
> 
> Your disagreement seems to rest on this assertion, and I don't see how
> your hypothetical described can be true. Do you really see the
> described behaviour in the current draft PEP as ???not doing anything
> uniquely Unix-y????

    No, the PEP is nothing but Unix-isms, that's my point.  The 3rd
    party code I'm hypothetically wading through has been coded to
    that interface, but semantically, it's not doing anything unique
    to Unix.

> `prevent_core`
>    :Default: ``True``
>
>        If true, prevents the generation of core files, in order to
>        avoid leaking sensitive information from daemons run as `root`.

    I was going to suggest service.set_secure(True); but then I wondered
    what is this actually achieving?  Won't the resulting .core will be
    owned by root?  

>`lockfile_directory`
>    :Default: ``'/var/run'``
>
>    Absolute directory path to contain the daemon's lockfile. If
>    ``None``, the lockfile behaviour for this daemon is skipped.
>
>`lockfile_name`
>    :Default: ``None``
>
>    Base name of the lockfile for this daemon, without directory or
>    suffix. If ``None``, the name is derived from the process command
>    line.

    All you're doing is ensuring multiple instances of the daemon don't
    run.  On Windows, you'd use a mutex, on Unix, sure, lockfile makes
    sense.  A cross-platform interface wouldn't bother exposing this
    implementation detail.

> > just your normal, run-of-the-mill start/stop type stuff.
> 
> As far as I can tell, beyond trivial use cases, there is both wide
> discrepancy and very little overlap in ???start/stop type stuff???
> between a Unix daemon and an MS Windows service. At least, none of the
> (admittedly few) instructions on MS Windows services I've seen
> demonstrate otherwise.

    Semantically the overlap is almost identical, which is why I'm
    interested in hearing why the QtService-type approach couldn't
    be leveraged here.  (The implementation details differ wildly,
    which is what you're referring to.)
 
> Someone who thinks otherwise is welcome to attempt a PEP that brings
> all that behaviour under a single banner *and* design the API to be
> both flexible enough to be useful in many use cases and simple enough
> to be worth learning instead of doing it manually. That person will
> not be me.

    class Service(object):
        EventType = namedtuple(
            Success = 1,
            Error = 2,
            Warning = 3,
            Information = 4,
        )
        StartupType = namedtuple(
            Auto = 0,
            Manual = 1
        )
        def __init__(self, name, desc=None, startup_type=StartupType.Auto)
            self.name = name
            self.description = desc

        def parse_arguments(args): pass
        def is_running(self): pass
        def is_installed(self): pass
        def install(self): pass
        def uninstall(self): pass
        def report_event(self, msg, event_type, id, category, data): pass

        def exec(args): pass
        def terminate(): pass
        def request_pause(): pass
        def request_resume(): pass
        def send_command(code): pass

        def run(args): raise NotImplementedError()

        def start(): pass
        def stop(): pass
        def pause(): pass
        def resume(): pass
        
    }:>


        Trent.



More information about the Python-ideas mailing list