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

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

    Как и большинство «знающих» вещей в Windows, ответ «Registry».

    Взгляните на эту статью базы знаний Майкрософт: http://support.microsoft.com/kb/103000

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

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

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

    Вот код для установки python-скрипта как службы, написанного на python 🙂

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

    Этот пост также может помочь вам:

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

    Не обращайтесь к реестру напрямую. Загрузите инструмент командной строки SC. А именно, SC CREATE

         ОПИСАНИЕ:
             SC - это программа командной строки, используемая для связи с
             NT Service Controller и сервисы.
         ПРИМЕНЕНИЕ:
             sc [команда] [название службы] ...
    
             Опция имеет форму "\\ ServerName"
             Дальнейшую помощь по командам можно получить, набрав: «sc [command]»
             Команды:
               query ----------- запрашивает статус для службы или
                               перечисляет статус видов услуг.
               queryex --------- запрашивает расширенный статус для службы или
                               перечисляет статус видов услуг.
               start ----------- Запуск службы.
               pause ----------- Отправляет запрос управления PAUSE в службу.
               допрашивать ----- Отправляет запрос управления INTERROGATE службе.
               continue -------- Отправляет запрос управления CONTINUE в службу.
               stop ------------ Отправляет запрос STOP в службу.
               config ---------- Изменяет конфигурацию службы (постоянная).
               описание ----- Изменяет описание службы.
               failure --------- Изменяет действия, предпринятые службой при сбое.
               qc -------------- Запросы информации о конфигурации для службы.
               qdescription ---- Запросит описание услуги.
               qfailure -------- Запросит действия, предпринятые службой при сбое.
               delete ---------- Удаляет службу (из реестра).
               create ---------- Создает службу.  (добавляет его в реестр).
               control --------- Отправляет элемент управления службе.
               sdshow ---------- Отображает дескриптор безопасности службы.
               sdset ----------- Устанавливает дескриптор безопасности службы.
               GetDisplayName - Получает DisplayName для службы.
               GetKeyName ------ Получает ServiceKeyName для службы.
               EnumDepend ------ Перечисляет сервисные зависимости.
    
             Следующие команды не требуют имени службы:
             Южная Каролина   
               boot ------------ (ok | bad) Указывает, должна ли последняя загрузка
                               сохранить в качестве последней конфигурации с хорошей загрузкой
               Блокировка ------------ Блокирует базу данных службы
               QueryLock ------- Запросы LockStatus для базы данных SCManager
         ПРИМЕР:
             sc начать MyService
    

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

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

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

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

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