Как заставить Windows знать о службе, которую я написал на Python?

В еще один вопрос Я опубликовал вчера, я получил очень хороший совет о том, как Python script можно запустить как службы в Windows. Мне стало интересно: как Windows понимает службы, которые могут управляться в собственных инструментах (окно "services" в "инструментах администрирования" ). I. e. что означает эквивалент Windows, который ставит/останавливает script в /etc/init.d в Linux?

Ответ 1

Как и большинство "осведомленных" вещей в Windows, ответ "Registry".

Взгляните на эту статью Microsoft Knowledge Base: http://support.microsoft.com/kb/103000

Найдите "программу Win32, которая может быть запущена Service Controller и подчиняется протоколу управления сервисом". Это тот сервис, который вам интересен.

Регистрация сервиса (содержимое KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services \ myservice) содержит информацию об услуге, включая такие вещи, как ее исполняемое местоположение, что делать, когда она терпит неудачу (останавливать ОС?), какие службы должны запускаться до этого, какой пользователь он запускает как.

Что касается протокола управления сервисом, main() вашей программы должен вызывать вызов Windows API, настраивая обратные вызовы для запуска, остановки, паузы для вашей службы. Что вы делаете в этих обратных вызовах, все зависит от вас.

Ответ 3

Не обращайтесь к реестру напрямую. Загрузите инструмент командной строки SC. А именно, 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 security descriptor.
          sdset-----------Sets a service 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

Ответ 4

Вы можете использовать srvany.exe из набора ресурсов Windows NT Resource Kit для создания пользовательской службы, которая будет отображаться в инструментах администратора...

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

Я использую этот метод для запуска tracd (python script/server) для trac.

Вот несколько очень четких инструкций: http://www.tacktech.com/display.cfm?ttid=197

Это требует некоторого редактирования реестра (очень минимального и легкого), но позволит вам сделать любую командную строку / script службой Windows.