У вас когда-нибудь возникало желание запустить приложение как системную службу? Думаю, что да, учитывая, что в некоторые программы такая возможность встроена по-умолчанию. А знаете ли вы, что приложение запущенное как служба, работает гораздо быстрее и занимает меньше места в памяти?
В этой статье мы рассмотрим небольшую утилиту Any Service , которая в два щелчка мышки, поможет запустить любое приложение как системную службу. Any Service является оболочкой двух стандартных утилит srvinstw и instsrv из комплекта Windows 2000 Server и для ее нормальной работы вам будут необходимы права Администратора. anyserv.zip [49 Kb] (cкачиваний: 63)
Программа полностью бесплатна, занимает всего 49Кб и не требует установки. Интерфейс интуитивно понятен и снабжен детальными пояснениями в виде всплывающих подсказок.
Главное окно программы позволяет произвести первичные настройки вашей будущей службы:
В первом поле вводим полный путь к исполнительному файлу приложения, которое будет запускаться как служба. В графе «Имя службы» указываем, как будет называться наша служба. В «Описание службы» — любое понятное вам описание нового сервиса.
Далее можно проставить нужные галочки:
Взаимодействие с рабочим столом — отметьте, если приложение имеет иконку в системном лотке;
Автозапуск службы — отметьте, если хотите, чтобы сервис запускался автоматически;
Запустить сразу после создания — отметьте, если хотите, чтобы служба запустилась сразу после ее создания;
Как пример работы утилиты, попробуем запустить в виде системной службы популярный файловый менеджер Total Commander.
После заполнения всех необходимых полей, нажимаем кнопку «Создать».
Все, новая служба создана и готова к работе. Можно посмотреть на результат своих действий, воспользовавшись кнопкой «Службы», которая открывает групповую оснастку.
Как видите, наша новая служба Total Commander запущена. Теперь вы можете изменять ее настройки также, как и у любой другой системной службы.
В случае, если вы захотите удалить службу, воспользуйтесь кнопкой «Удаление. » в главном окне программы. Перед вами откроется такое окно:
Находим нужную службу и жмем «Удалить». Больше сервиса Total Commander не существует.
Известные проблемы : перед первым запуском, желательно отключить антивирусную программу иначе дальнейшая работа программы будет невозможна, т.к. при первом запуске, она ищет обе утилиты (srvinstw и instsrv) в папке %WINDIR%\System32\ и если не находит, копирует их из собственного ресурса.
Вас когда-нибудь посещала мысль запустить приложение как системную службу? Например, Punto Switcher или CLCL или Speed Fan. Знаете ли Вы, что запущенное таким образом приложение, работает гораздо быстрей и занимает места в памяти намного меньше обычного? Лично я, это ощутил когда запустил WinLIRC и uICE как службы.
Теперь по сути: программа является оболочкой двух стандартных утилит srvinstw и instsrv из комплекта Windows 2000 Server Resource Kit. Я не стал изобретать велосипед, а просто зашил эти две утилиты в ресурсы программы («все гениальное — просто» J).
Возможности: создание и удаление служб. Не требует установки. Не оставляет следов ни в реестре ни на диске. Требования: Windows не старше 4 версии (2000) и права администратора.
Известные проблемы: перед первым запуском, желательно отключить антивирусную программу иначе дальнейшая работа программы будет невозможна, т.к. при первом запуске, она ищет обе утилиты в папке %WINDIR%\System32\ и если не находит, копирует их из собственного ресурса.
Пока не решена проблема с параметром «Взаимодействие с рабочим столом»! Если этот параметр включен вместе с параметром «Запустить сразу после создания», то параметр «Взаимодействие с рабочим столом» не будет иметь силу! Возможное решение этой проблемы, полная перезагрузка компьютера.
Srvany & Instsrv With Srvany, you can configure any Windows application so that it runs as a service.
Утилита, позволяющая запускать любую программу как службу, позволяя тем самым создавать пользовательские службы. srvany используется только для запуска, принимая в качестве аргумента имя приложения. Для инсталляции приложения как службы используется instsrv.exe.
Как запустить программу как сервис? A: 1. Лучше всего это делать под аккаyнтом админа, тогда пpи любом дpyгом аккаунте созданный сервис будет продолжать работать. 2. Копиpyете файлы instsrv.exe и srvany.exe в какyю-нибyдь системнyю диpектоpию, напpимеp, в winnt\system32\ (Берутся из Resouce Kit \compmgmt.cab\srvany.exe, instsrv.exe. Ещё есть srvinstw — это GUI пошаговая оболочка делающая то же, что и instsrv, но ещё может ставить/сносить службы удаленно). 3. Запyскаете из командной стpоки: instsrv MyService c:\полный_пyть\srvany.exe где MyService — пpидyманное вами имя вновь созданного сеpвиса. Если в имени имеются пpобелы, то имя сеpвиса необходимо заключить в кавычки. 4. Тепеpь надо сконфигypиpовать этот сеpвис. Идёте в: Start -> Settings -> Control Panel -> Services, находите свой новосозданный сеpвис и щёлкаете на нём 2 pаза левой кнопочкой мышки. В откpывшемся окошке отмечаете, каким способом ваш сеpвис бyдет запyскаться: Automatic — бyдет запyскаться автоматически пpи загpyзки компьютеpа, Manual — бyдет запyскаться только, когда вpyчнyю запyстите, Disabled — совсем не бyдет запyскаться. Если хотите видеть заппущенный сеpвис в виде окна на десктопе, то отметьте чек-бокс «Allow Service to Interact with Desktop». 5. Запyскаете regedt32 и создаёте key «Parameters» (без кавычек) в: HKLM \ SYSTEM \ CurrentControlSet \ Service \ Имя_Вашего_сеpвиса \ 6. Создаёте под созданным вами ключом «Parameters» (без кавычек) value «Application» (без кавычек) тип — REG_SZ: и пpописываете там полный пyть к исполняемомy файлy. Hапpимеp, Application: REG_SZ: c:\полный_пyть\t-mail.cmd 7. Пеpезагpyжаете компьютеp или стартуете сервис вручную. Выходить из таких сеpвисов лyчше по флагy.
AppToService (formerly ServiceIt)
Также можно воспользоваться программой AppToService от компании Basta Computing, Inc. http://www.basta.com Shareware with a 30 days, 20$
Последний раз редактировалось Erekle, 05-04-2007 в 22:02 .
Пилим свою службу 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.
Расскажите, а вам приходилось превращать скрипты и приложения в службы?