views:

544

answers:

6

In another question I posted yesterday, I got very good advice on how a Python script could be run as a service in Windows. What I'm left wondering is: How is Windows aware of the services that can be managed in the native tools ("services" window in "administrative tools"). I. e. what is the Windows equivalent of putting a start/stop script in /etc/init.d under Linux?

+6  A: 

Here is code to install a python-script as a service, written in python :)

http://code.activestate.com/recipes/551780/

This post could also help you out:

http://essiene.blogspot.com/2005/04/python-windows-services.html

Espo
A: 

A well written service (and most services written as described in the links posted by Espo) are auto-registering, that meaning that when passed "install" on the command line, they should register themselves.

dguaraglia
+4  A: 

As with most "aware" things in Windows, the answer is "Registry".

Take a look at this Microsoft Knowledge Base article: http://support.microsoft.com/kb/103000

Search for "A Win32 program that can be started by the Service Controller and that obeys the service control protocol." This is the kind of service you're interested in.

The service registration (contents of KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services \myservice) carries information about the service, including things like its executable location, what to do when it fails (halt the OS?), what services must be started before this one, what user it runs as.

As to service control protocol, main() of your program is supposed to invoke a Windows API call, setting up callbacks for start, stop, pause for your service. What you do in those callbacks is all up to you.

Arkadiy
A: 

You can use srvany.exe from Windows NT Resource Kit to create a user defined service that will show up in the admin tools...

http://support.microsoft.com/kb/137890

I am using this method to run tracd (a python script / server) for trac.

Here are some very clear instructions: http://www.tacktech.com/display.cfm?ttid=197

It does require some registry editing (very minimal and easy) but will allow you to make any command line / script a windows service.

mmattax
A: 

web2py can run as a windows service. It may help you to look into web2y/gluon/winservice.py.

massimo
+2  A: 

Don't muck with the registry directly. User the SC command-line tool. Namely, SC CREATE

    DESCRIPTION:
        SC is a command line program used for communicating with the
        NT Service Controller and services.
    USAGE:
        sc  [command] [service name]  ...

        The option  has the form "\\ServerName"
        Further help on commands can be obtained by typing: "sc [command]"
        Commands:
          query-----------Queries the status for a service, or
                          enumerates the status for types of services.
          queryex---------Queries the extended status for a service, or
                          enumerates the status for types of services.
          start-----------Starts a service.
          pause-----------Sends a PAUSE control request to a service.
          interrogate-----Sends an INTERROGATE control request to a service.
          continue--------Sends a CONTINUE control request to a service.
          stop------------Sends a STOP request to a service.
          config----------Changes the configuration of a service (persistant).
          description-----Changes the description of a service.
          failure---------Changes the actions taken by a service upon failure.
          qc--------------Queries the configuration information for a service.
          qdescription----Queries the description for a service.
          qfailure--------Queries the actions taken by a service upon failure.
          delete----------Deletes a service (from the registry).
          create----------Creates a service. (adds it to the registry).
          control---------Sends a control to a service.
          sdshow----------Displays a service's security descriptor.
          sdset-----------Sets a service's security descriptor.
          GetDisplayName--Gets the DisplayName for a service.
          GetKeyName------Gets the ServiceKeyName for a service.
          EnumDepend------Enumerates Service Dependencies.

        The following commands don't require a service name:
        sc   
          boot------------(ok | bad) Indicates whether the last boot should
                          be saved as the last-known-good boot configuration
          Lock------------Locks the Service Database
          QueryLock-------Queries the LockStatus for the SCManager Database
    EXAMPLE:
        sc start MyService
Ferruccio