В еще один вопрос Я опубликовал вчера, я получил очень хороший совет о том, как Python script можно запустить как службы в Windows. Мне стало интересно: как Windows понимает службы, которые могут управляться в собственных инструментах (окно "services" в "инструментах администрирования" ). I. e. что означает эквивалент Windows, который ставит/останавливает script в /etc/init.d в Linux?
Как заставить Windows знать о службе, которую я написал на Python?
Ответ 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, настраивая обратные вызовы для запуска, остановки, паузы для вашей службы. Что вы делаете в этих обратных вызовах, все зависит от вас.
Ответ 2
Вот код для установки python- script как службы, написанной на python:)
http://code.activestate.com/recipes/551780/
Этот пост также может помочь вам:
http://essiene.blogspot.com/2005/04/python-windows-services.html
Ответ 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.