- Запуск PowerShell скрипта как службы Windows
- Создание службы Windows с использованием Python
- Введение
- Примеры
- Скрипт Python, который можно запустить как сервис
- Запуск веб-приложения Flask в качестве службы
- Синтаксис
- Параметры
- Примечания
- Пилим свою службу Windows – руководство для «не настоящих программистов»
- Зачем нужна служба, если есть назначенные задания
- Способ первый. От Microsoft
- Способ второй, почти взрослый
- Способ третий. AutoIT
- Как запустить сценарий Python в качестве службы в Windows?
- GUI подход
- Подход к написанию сценариев (без графического интерфейса)
- Способ 1. Используйте instsrv и srvany из rktools.exe
- Метод 2: используйте ServiceInstaller для Windows NT
- Полный пример pywin32 с использованием цикла или подпотока
- Обновить:
Запуск PowerShell скрипта как службы Windows
Из любого скрипта PowerShell можно сделать службу Windows, которая работает в фоновом режиме и запускается автоматически при загрузке сервера. Вы можете создать службу Windows с помощью утилит srvany.exe и instsrv.exe (из состава Windows Server Resource 2003 Kit), позволяющих запустить процесс powershell.exe с параметром в виде пути к ps1 файлу скрипта. Основной недостаток такого способа создания службы — srvany.exe не контролирует выполнение приложения (скрипта PowerShell в нашем случае) и, если приложение падает (зависает), то служба это не видит и продолжает работать. В этой статье для создания службы Windows из файла со скриптом PowerShell мы будем использовать утилиту NSSM (Non-Sucking Service Manager – оставим без перевода…:)), которая лишена этих недостатков.
Вы можете скачать и установить NSSM вручную или через Chocolately. Сначала нужно разрешить запуск PS1 скриптов в сесиии и установить сам Choco:
Set-ExecutionPolicy Bypass -Scope Process -Force; `
iex ((New-Object System.Net.WebClient).DownloadString(‘https://chocolatey.org/install.ps1’))
Затем установим пакет NSSM:
choco install nssm
В этом примере мы будем в реальном времени отслеживать изменения определенной группы AD (скрипт из этой статьи) и при изменении оповещать администратора безопасности всплывающим уведомлением и письмом.
Итак, у нас имеется код, который нужно сохранить в PS1 файл. Добавим бесконечный цикл, который раз в минуту выполняет проверку:
while($true) <
#Ваш PS код
Start-Sleep –Seconds 60
>
Создать службу из скрипта PowerShell при помощи NSSM можно прямо из PowerShell :):
$NSSMPath = (Get-Command «C:\tools\nssm\win64\nssm.exe»).Source
$NewServiceName = “CheckADGroupSrv”
$PoShPath= (Get-Command powershell).Source
$PoShScriptPath = “C:\tools\CheckADGroup\checkad.ps1”
$args = ‘-ExecutionPolicy Bypass -NoProfile -File «<0>«‘ -f $PoShScriptPath
& $NSSMPath install $NewServiceName $PoShPath $args
& $NSSMPath status $NewServiceName
Запустим новую службу:
Итак, вы создали и запустили новую службу Windows. Проверим, что она появилась в консоли управления службами services.msc
Служба CheckADGroupSrv действительно появилась, она настроена на автоматический запус и в данный момент запущена (Running). Как вы видите, ваш PowerShell скрипт запущен внутри процесса nssm.exe.
Чтобы служба могла отображать уведомления в сеанс пользователя (взаимодействовать с рабочим столом) нужно на вкладке “Вход в систему” (Log on) включить опцию “Разрешить взаимодействие с рабочим столом” (Allow service to interact with desktop).
Start-Service -Name ui0detect
Однако в Windows 10 1803 службу Interactive Services Detection Service полностью убрали из системы, и вы более не можете переключиться в нулевую сессию (Session 0), так что вы просто не увидите окна, которые выводятся из-под аккаунта System.
Вы можете изменить описание службы командой:
& $NSSMPath set $NewServiceName description “Мониторинг изменений группы AD”
Чтобы удалить созданную службу можете воспользоваться командой sc delete или
Создание службы Windows с использованием Python
Введение
Примеры
Скрипт Python, который можно запустить как сервис
Модули , используемые в данном примере , являются частью pywin32 (Python для расширений Windows). В зависимости от того, как вы установили Python, вам может потребоваться установить его отдельно.
Это просто шаблон. Код вашего приложения, вероятно, вызывающий отдельный скрипт, будет идти в функцию main ().
Вам также нужно будет установить это как сервис. Лучшее решение для этого в данный момент , как представляется, использовать Non-сосущий Service Manager . Это позволяет установить службу и предоставляет графический интерфейс для настройки командной строки, которую выполняет служба. Для Python вы можете сделать это, что создает сервис за один раз:
Где my_script.py — это приведенный выше шаблон сценария, измененный для вызова сценария приложения или кода в функции main (). Обратите внимание, что сервис не запускает скрипт Python напрямую, он запускает интерпретатор Python и передает ему основной скрипт в командной строке.
В качестве альтернативы вы можете использовать инструменты, предоставленные в Windows Server Resource Kit для вашей версии операционной системы, поэтому создайте службу.
Запуск веб-приложения Flask в качестве службы
Это вариант общего примера. Вам просто нужно импортировать приложение сценарий и вызвать это run() метод в сервисе main() функции. В этом случае мы также используем многопроцессорной модуль из — за проблемы с доступом WSGIRequestHandler .
Взято из https://codecamp.ru/a/25130524/318488
Синтаксис
Параметры
Примечания
Научим основам Python и Data Science на практике
Это не обычный теоритический курс, а онлайн-тренажер, с практикой на примерах рабочих задач, в котором вы можете учиться в любое удобное время 24/7. Вы получите реальный опыт, разрабатывая качественный код и анализируя реальные данные.
Пилим свою службу Windows – руководство для «не настоящих программистов»
Однажды вы задумаетесь, как превратить скрипт или приложение в Windows-службу. Скорее всего, задача окажется не такой уж тривиальной – приложению как минимум потребуется специальный интерфейс для получения команд от системы. А раз есть требования и ограничения, то есть и скрипты, и милые сердцу костылики для преодоления.
Статья будет полезна тем, кто, как и я — «программист не настоящий».
Зачем нужна служба, если есть назначенные задания
В отличие от назначенных заданий служба работает постоянно, запускается при старте ПК и может управляться средствами Windows. А еще регулярно запускаемому скрипту могут понадобиться данные с предыдущего запуска, и может быть полезно получение данных из внешних источников — например, в случае TCP или Web сервера.
Лично мне за последние пять лет приходилось создавать службу три с половиной раза:
- Потребовалось создать сервис на fail2ban для Windows 2003., который работал с логами FileZilla и Apache, а при подозрении на брутфорс блокировал IP штатными средствами Windows — ipsec.
- Аналог телнет-сервера для домашних версий Windows. Понадобилось выполнять команды на удаленных рабочих станциях, которые были под управлением Windows 7 Home. По сути, вторая попытка поиграть в службы.
- Музыкальный проигрыватель для торгового зала под Windows. Задачу по ТЗ можно было решить при помощи mpd и пачки скриптов, но я решил — если уж делать скрипты, то почему бы и не «сваять» проигрыватель самому. За основу взял библиотеку BASS.dll.
- Когда выбирали веб-сервер с поддержкой загрузки файлов под Windows, одним из вариантов был HFS. Сам по себе работать он не может, поэтому пришлось «запихивать» его в службу. В результате решение не понравилось, и просто установили «тему» Apaxy на web-сервере Apache.
Для создания службы можно использовать взрослые языки программирования вроде C. Но если вы не хотите связываться с Visual Studio, то возьмите готовые утилиты. Существуют платные решения вроде FireDaemon Pro или AlwaysUp, но мы традиционно сосредоточимся на бесплатных.
Способ первый. От Microsoft
Этот уже немолодой механизм состоит из двух компонентов: утилиты instsrv.exe для установки сервиса и srvany.exe — процесса для запуска любых исполняемых файлов. Предположим, что мы создали веб-сервер на PowerShell при помощи модуля Polaris. Скрипт будет предельно прост:
Работа так называемого «сервера».
Теперь попробуем превратить скрипт в службу. Для этого скачаем Windows Resource Kit Tools, где будут наши утилиты. Начнем с того, что установим пустой сервис командой:
Где WebServ — имя нашего нового сервиса. При необходимости через оснастку services.msc можно задать пользователя, под которым будет запускаться служба, и разрешить взаимодействие с рабочим столом.
Теперь пропишем путь к нашему скрипту при помощи магии реестра. Параметры службы есть в разделе реестра HKLM\SYSTEM\CurrentControlSet\Services\WebServ. В нем нам нужно добавить новый раздел Parameters и создать там строковый параметр Application, указав в нем путь к исполняемому файлу. В случае скрипта PowerShell он будет выглядеть так:
Настроенная служба.
Можно запустить и радоваться.
Работающая служба.
Однако у этого способа есть недостатки:
- Утилиты старые, разработаны до изобретения PowerShell, UAC и прочих вещей.
- Srvany не контролирует работу приложения. Даже если оно выпадет в ошибку, служба продолжит свое дело как ни в чем не бывало.
- Придется донастраивать и копаться в реестре. Вы же помните, что копаться в реестре небезопасно?
Поэтому перейдем к методу, частично лишенному этих проблем.
Способ второй, почти взрослый
Существует утилита под названием NSSM — Non-Sucking Service Manager, что можно перевести как не-плохой менеджер служб. В отличие от предыдущей, она поддерживается разработчиком, и исходный код опубликован на сайте. Помимо обычного способа, доступна и установка через пакетный менеджер Chocolately.
Создать сервис можно из обычной командной строки, вооружившись документацией на сайте разработчика. Но мы воспользуемся PowerShell. Потому что можем, разумеется.
Установка через PowerShell.
Для разнообразия проверим работу службы не браузером, а тоже через PowerShell командой Invoke-RestMethod.
И вправду работает.
В отличие от srvany, этот метод позволяет перезапускать приложение на старте, перенаправлять stdin и stdout и многое другое. В частности, если не хочется писать команды в командную строку, то достаточно запустить GUI и ввести необходимые параметры через удобный интерфейс.
GUI запускается командой:
Настроить можно даже приоритет и использование ядер процессора.
Действительно, возможностей куда больше, чем у srvany и ряда других аналогов. Из минусов бросается в глаза недостаточный контроль над всем процессом.
Налицо нехватка «жести». Поэтому я перейду к самому хардкорному методу из всех опробованных.
Способ третий. AutoIT
Поскольку я давний любитель этого скриптового языка, то не смог пройти мимо библиотеки под названием _Services_UDF v4. Она снабжена богатой документацией и примерами, поэтому под спойлером сразу приведу полный текст получившегося скрипта.
Итак, попробуем «завернуть» в нее наш веб-сервис:
Разберу подробнее момент запуска приложения. Он начинается после операции $bServiceRunning = True и превращается в, казалось бы, бесконечный цикл. На самом деле этот процесс прервется, как только служба получит сигнал о завершении — будь то выход из системы или остановка вручную.
Поскольку программа для скрипта является внешней (powershell.exe), то после выхода из цикла нам нужно закончить ее работу с помощью ProcessClose.
Для этого скрипт необходимо скомпилировать в .exe, а затем установить службу, запустив exe с ключом -i.
Оно работает!
Разумеется, этот способ не самый удобный, и все дополнительные возможности придется реализовывать самостоятельно, будь то повторный запуск приложения при сбое или ротация логов. Но зато он дает полный контроль над происходящим. Да и сделать в итоге можно куда больше — от уведомления в Telegram о сбое службы до IPC-взаимодействия с другими программами. И вдобавок — на скриптовом языке, без установки и изучения Visual Studio.
Расскажите, а вам приходилось превращать скрипты и приложения в службы?
Как запустить сценарий Python в качестве службы в Windows?
Я делаю набросок архитектуры набора программ, которые совместно используют различные взаимосвязанные объекты, хранящиеся в базе данных. Я хочу, чтобы одна из программ действовала как служба, обеспечивающая интерфейс более высокого уровня для операций с этими объектами, а другие программы — для доступа к объектам через эту службу.
В настоящее время я стремлюсь к Python и фреймворку Django в качестве технологий для реализации этой службы. Я почти уверен, что понимаю, как демонизировать программу Python в Linux. Однако это необязательный элемент спецификации, что система должна поддерживать Windows. У меня мало опыта программирования для Windows и вообще нет опыта работы со службами Windows.
Можно ли запускать программы Python как службу Windows (т.е. запускать ее автоматически без входа пользователя в систему)? Мне не обязательно реализовывать эту часть, но мне нужно общее представление о том, как это будет сделано, чтобы решить, следует ли проектировать в соответствии с этими направлениями.
Изменить: Спасибо за все ответы, они довольно исчерпывающие. Я хотел бы узнать еще кое-что: как Windows узнает о моей службе? Могу ли я управлять этим с помощью родных утилит Windows? Что эквивалентно помещению сценария запуска / остановки в /etc/init.d?
Да, ты можешь. Я делаю это с помощью библиотек pythoncom, которые входят в состав ActivePython или могут быть установлены с pywin32 (расширения Python для Windows).
Это базовый скелет для простого сервиса:
Ваш код войдет в main() метод — обычно с каким-то бесконечным циклом, который может быть прерван проверкой флага, установленного вами в SvcStop методе
Хотя пару недель назад я поддержал выбранный ответ, тем временем я еще больше боролся с этой темой. Похоже, что иметь специальную установку Python и использовать специальные модули для запуска скрипта как службы — это просто неправильный путь. Что насчет портативности и тому подобного?
Я наткнулся на замечательный Non-sucking Service Manager , который сделал работу со службами Windows действительно простой и разумной. Я подумал, что, поскольку я могу передавать параметры установленной службе, я могу с таким же успехом выбрать исполняемый файл Python и передать свой скрипт в качестве опции.
Я еще не пробовал это решение, но сделаю это прямо сейчас и буду обновлять этот пост в процессе. Я также заинтересован в использовании virtualenvs в Windows, поэтому рано или поздно я могу придумать учебник и дать ссылку на него здесь.
Самый простой способ — использовать: NSSM — Non-Sucking Service Manager. Просто скачайте и разархивируйте в любое место по вашему выбору. Это автономная утилита, около 300 КБ (намного меньше, чем установка всего пакета pywin32 только для этой цели), и никакой «установки» не требуется. Архив содержит 64-битную и 32-битную версии утилиты. Любой из них должен хорошо работать в текущих системах (вы можете использовать 32-битную версию для управления службами в 64-битных системах).
GUI подход
1 — установить программу python как службу. Откройте приглашение Win от имени администратора
2 — На консоли GUI NSSM:
путь: C: \ Python27 \ Python27.exe
Каталог запуска: C: \ Python27
Аргументы: c: \ WinService.py
3 — проверьте созданные сервисы на services.msc
Подход к написанию сценариев (без графического интерфейса)
Это удобно, если ваша служба должна быть частью автоматизированной, неинтерактивной процедуры, которая может находиться вне вашего контроля, например, пакетного сценария или сценария установки. Предполагается, что команды выполняются с правами администратора.
Для удобства команды описаны здесь, просто указав утилиту как nssm.exe . Тем не менее, рекомендуется более явно ссылаться на него в сценариях с полным путем c:\path\to\nssm.exe , поскольку это автономный исполняемый файл, который может находиться на частном пути, о котором система не знает.
1. Установите службу
Вы должны указать имя службы, путь к соответствующему исполняемому файлу Python и путь к скрипту:
В качестве альтернативы вы можете захотеть, чтобы ваше приложение Python запускалось как модуль Python. Один из простых подходов — сообщить nssm, что ему необходимо перейти в правильный стартовый каталог, как вы сделали бы сами при запуске из командной оболочки:
Этот подход хорошо работает с виртуальными средами и автономными (встроенными) установками Python. Просто убедитесь, что вы правильно решили все проблемы с путями в этих средах с помощью обычных методов. nssm может при необходимости устанавливать переменные среды (например, PYTHONPATH), а также запускать пакетные сценарии.
2. Для запуска службы
3. Чтобы остановить службу
4. Чтобы удалить службу , укажите confirm параметр, чтобы пропустить интерактивное подтверждение.
Существует несколько альтернатив для установки в качестве службы практически любого исполняемого файла Windows.
Способ 1. Используйте instsrv и srvany из rktools.exe
Для Windows Home Server или Windows Server 2003 (также работает с WinXP) Windows Server 2003 Resource Kit Tools поставляется с утилитами, которые можно использовать в тандеме для этого, под названием instsrv.exe и srvany.exe . См. Эту статью базы знаний Майкрософт KB137890 для получения подробной информации о том, как использовать эти утилиты.
Для Windows Home Server есть отличная удобная оболочка для этих утилит под названием « Any Service Installer ».
Метод 2: используйте ServiceInstaller для Windows NT
Существует еще одна альтернатива с использованием ServiceInstaller для Windows NT (которую можно загрузить здесь ) с доступными инструкциями на языке Python . Вопреки названию, он работает как с Windows 2000, так и с Windows XP. Вот несколько инструкций по установке скрипта Python в качестве службы.
Установка скрипта Python
Запустите ServiceInstaller, чтобы создать новую службу. (В этом примере предполагается, что python установлен в c: \ python25)
После установки откройте приложение «Службы» панели управления, выберите и запустите службу PythonTest.
После своего первоначального ответа я заметил, что на SO уже были опубликованы тесно связанные вопросы и ответы. Смотрите также:
Самый простой способ добиться этого — использовать встроенную команду sc.exe:
Ссылки:
Пошаговое объяснение, как заставить его работать:
1- Сначала создайте файл python в соответствии с основным скелетом, упомянутым выше. И сохраните его по пути, например: «c: \ PythonFiles \ AppServerSvc.py»
2 — На этом шаге мы должны зарегистрировать нашу службу.
Запустите командную строку от имени администратора и введите:
sc create TestService binpath = «C: \ Python36 \ Python.exe c: \ PythonFiles \ AppServerSvc.py» DisplayName = «TestService» start = auto
первый аргумент binpath — это путь к python.exe
второй аргумент binpath — это путь к вашему файлу python, который мы уже создали
Не упустите возможность ставить один пробел после каждого знака » = «.
Тогда, если все в порядке, вы должны увидеть
Теперь ваша служба Python установлена как служба Windows. Вы можете увидеть это в Service Manager и в реестре в разделе:
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ TestService
3- Хорошо. Вы можете запустить свою службу в диспетчере служб.
Вы можете выполнить любой файл python, который предоставляет этот скелет службы.
Пример сценария для запуска как службы, взятый с pythonhosted.org :
Создать и запустить сервис
Остановить и удалить службу
nssm в Python 3+
(Я преобразовал свой файл .py в .exe с помощью pyinstaller )
nssm: как было сказано ранее
- запустите nssm install
На консоли NSSM:
путь: путь \ к \ вашей \ программе.exe
Каталог запуска: путь \ to \ your \ # такой же, как путь, но без вашего program.exe
Аргументы: пусто
Если вы не хотите конвертировать свой проект в .exe
- создать файл .bat с python <
> - и установите путь к файлу .bat
Я начал хостинг как услугу с pywin32 .
Все было хорошо, но я столкнулся с проблемой, что служба не могла запуститься в течение 30 секунд (тайм-аут по умолчанию для Windows) при запуске системы. Для меня это было критично, потому что запуск Windows происходил одновременно на нескольких виртуальных машинах, размещенных на одной физической машине, и нагрузка ввода-вывода была огромной. Сообщения об ошибках были:
Error 1053: The service did not respond to the start or control request in a timely fashion.
Error 7009: Timeout (30000 milliseconds) waiting for the service to connect.
Я много боролся с pywin, но в итоге использовал NSSM, как было предложено в этом ответе . На него было очень легко перейти.
Полный пример pywin32 с использованием цикла или подпотока
Поработав над этим в течение нескольких дней, вот ответ, который я хотел бы найти, используя pywin32, чтобы он оставался красивым и самодостаточным.
Это полный рабочий код для решения на основе одного цикла и одного потока. Он может работать как на python 2, так и на 3, хотя я тестировал только последнюю версию на 2.7 и Win7. Цикл должен подходить для кода опроса, а протектор должен работать с кодом, более похожим на сервер. Кажется, он прекрасно работает с wsgi-сервером официантки , у которого нет стандартного способа корректного завершения работы.
Я также хотел бы отметить, что, похоже, существует множество примеров, подобных этому , которые почти полезны, но на самом деле вводят в заблуждение, потому что они слепо вырезали и вставляли другие примеры. Я могу ошибаться. но зачем создавать событие, если вы его никогда не ждете?
Тем не менее, я все еще чувствую, что я здесь несколько шатко, особенно в отношении того, насколько чистым является выход из версии потока, но, по крайней мере, я считаю, что здесь нет ничего вводящего в заблуждение .
Для запуска просто скопируйте код в файл и следуйте инструкциям.
Обновить:
Используйте простой флаг для завершения потока. Важным моментом является то, что печать «нить сделана».
Более подробный пример выхода из потока неконтролируемого сервера см. В моем сообщении о wsgi-сервере официантки .
Принятый ответ с использованием win32serviceutil работает, но сложен и усложняет отладку и внесение изменений. Это гораздо проще в использовании NSSM ( Не-сосание Service Manager) . Вы пишете и с комфортом отлаживаете обычную программу на Python, и когда она наконец заработает, вы используете NSSM, чтобы установить ее как службу менее чем за минуту:
Вы запускаете командную строку с повышенными правами (администратор) nssm.exe install NameOfYourService и вводите следующие параметры:
- путь : (например, путь к python.exe C:\Python27\Python.exe )
- Аргументы : (например, путь к вашему скрипту python c:\path\to\program.py )
Кстати, если ваша программа печатает полезные сообщения, которые вы хотите сохранить в файле журнала, NSSM также может обработать это и многое другое за вас.
Этот ответ является плагиатором из нескольких источников на StackOverflow — большинство из них указано выше, но я забыл о других — извините. Это просто, и сценарии работают «как есть». Для выпусков вы тестируете сценарий, затем копируете его на сервер и останавливаете / запускаете соответствующую службу. И он должен работать для всех языков сценариев (Python, Perl, node.js), а также для пакетных сценариев, таких как GitBash, PowerShell, даже старых сценариев летучей мыши DOS. pyGlue — это связующее звено между службами Windows и вашим скриптом.
Теперь нужно немного отредактировать, и вы не хотите, чтобы все ваши сервисы назывались pyGlue. Итак, есть сценарий (build.sh) для вставки битов и создания настраиваемого «pyGlue» и создания «.exe». Это файл .exe, который устанавливается как служба Windows. После установки вы можете настроить его на автоматический запуск.
Установка — скопируйте ‘.exe’ сервер и скрипт в указанную папку. Запустите .exe от имени администратора с опцией «установить». Откройте службы Windows в качестве администратора и запустите службу. Для обновления просто скопируйте новую версию скрипта и остановите / запустите службу.
Теперь все серверы разные — разные установки Python, разные структуры папок. Я поддерживаю папку для каждого сервера с копией pyGlue.py и build.sh. И я создаю сценарий serverBuild.sh для восстановления всей службы на этом сервере.
Следите за PySvc.py
изменение папки dll
Я знаю, что это старое, но я застрял на этом навсегда. Для меня эта конкретная проблема была решена путем копирования этого файла — pywintypes36.dll
Из -> Python36 \ Lib \ site-packages \ pywin32_system32
Кому -> Python36 \ Lib \ site-packages \ win32
- изменение пути к папке python на
- NET START PySvc
- NET STOP PySvc