2008-08-29 5 views
10

Dans another question J'ai posté hier, j'ai obtenu de très bons conseils sur la façon dont un script Python pourrait être exécuté en tant que service dans Windows. Ce que je me suis demandé est: Comment Windows est-il conscient des services qui peuvent être gérés dans les outils natifs (fenêtre "services" dans "outils d'administration"). C'est à dire. Quel est l'équivalent Windows de mettre un script start/stop dans /etc/init.d sous Linux?Comment informer Windows d'un service que j'ai écrit en Python?

Répondre

3

Comme la plupart des choses "conscientes" dans Windows, la réponse est "Registre".

Jetez un oeil à cet article Base de connaissances Microsoft: http://support.microsoft.com/kb/103000

Recherche « Un programme Win32 qui peut être démarré par le contrôleur de service et qui obéit le protocole de contrôle de service. » C'est le genre de service que vous êtes intéressé.

L'enregistrement de services (contenu de KEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ myservice) Carriès informations sur le service, y compris des choses comme son emplacement exécutable, quoi faire quand il échoue (arrêter le système d'exploitation?), quels services doivent être démarrés avant celui-ci, quel utilisateur il exécute comme. En ce qui concerne le protocole de contrôle de service, main() de votre programme est supposé appeler un appel d'API Windows, en configurant des rappels pour le démarrage, l'arrêt et la pause pour votre service. Ce que vous faites dans ces rappels est tout pour vous.

+0

les hacks de registre sont de mauvaise forme. En fait, forme horrible. Le fichier .py doit accepter le paramètre de ligne -install cmd et s'installer en tant que service, en utilisant les API publiées et les méthodes pour le faire (par exemple, PAS via un accès direct au registre) – Jonesome

0

Vous pouvez utiliser srvany.exe de Windows NT Resource Kit pour créer un service défini par l'utilisateur qui apparaissent dans les outils d'administration ...

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

J'utilise cette méthode pour exécuter tracd (un script/serveur python) pour trac.

Voici quelques instructions très claires: http://www.tacktech.com/display.cfm?ttid=197

Il ne nécessite quelques modifications de registre (très minime et facile), mais vous permettra de faire une ligne de commande/script un service Windows.

7

Ne collez pas le registre directement. Utilisateur l'outil de ligne de commande SC. A savoir, 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 
Questions connexes