Запуск консольного приложения как службы
Как я могу запустить его как службу, пожалуйста, помогите мне. Заранее спасибо сангита
4 ответа
И добавьте свой основной код в обработчики событий OnStart () и OnStop (), затем установите его как службу:
Я только что протестировал это в Visual Studio 2013, и он работает.
- Создайте новый проект «Служба Windows».
- Измените тип вывода проекта на «Консольное приложение»
Вот как выглядит мой Program.cs:
Вы можете добавить установку службы вот так
Вы можете установить службу с помощью этой команды: installutil.exe /i YouExeName.exe
Вы можете удалить службу с помощью этой команды: installutil.exe /u YouExeName.exe
Чтобы создать консольное приложение, которое также может работать как служба Windows.
Файл MainPayload.cs . Вы можете игнорировать все другие файлы и вставить в этот файл свой давно работающий код. Обратите внимание на CancellationTokenSource , это сделано для того, чтобы ваша служба могла быстро завершить работу, когда служба остановится.
Файл EntryPoint.cs . Это точка входа как для консольного приложения, так и для службы.
Файл ProjectInstaller.cs . Это установщик службы.
Файл ServiceController.cs . Он содержит методы Start() и Stop() для службы.
Чтобы установить это как службу Windows, используйте installutil.exe ServiceName.exe . Для удаления используйте installutil.exe ServiceName.exe -u . Это означает, что вам нужно будет открыть Visual Studio 2012 x32 command prompt , который находится под Visual Studio Tools в Start Menu . Если вы компилируете в 32-битном режиме, используйте 32-битную командную строку, а если вы компилируете в 64-битном режиме, откройте 64-битную командную строку (это означает, что пути настроены правильно, как installutil.exe имеет отдельные версии в зависимости от того, 32-битная она или 64-битная).
Единственный другой трюк - щелкнуть правой кнопкой мыши на сером фоне страницы «Service1.cs», затем нажмите" Добавить установщик ", который добавит установщик. Если вы этого не сделаете, то installutil.exe выдаст вам ошибку.
Вы также должны щелкнуть правой кнопкой мыши на serviceProcessInstaller1 , затем выбрать Properties и установить Account на LocalService , иначе это будет запрашивать учетные данные для имени пользователя при установке службы.
Вот необходимые дополнительные ссылки (они добавляются автоматически при создании новой службы 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, но мы традиционно сосредоточимся на бесплатных.
Этот уже немолодой механизм состоит из двух компонентов: утилиты 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 и ряда других аналогов. Из минусов бросается в глаза недостаточный контроль над всем процессом.
Налицо нехватка «жести». Поэтому я перейду к самому хардкорному методу из всех опробованных.
Поскольку я давний любитель этого скриптового языка, то не смог пройти мимо библиотеки под названием _Services_UDF v4. Она снабжена богатой документацией и примерами, поэтому под спойлером сразу приведу полный текст получившегося скрипта.
Итак, попробуем «завернуть» в нее наш веб-сервис:
Разберу подробнее момент запуска приложения. Он начинается после операции $bServiceRunning = True и превращается в, казалось бы, бесконечный цикл. На самом деле этот процесс прервется, как только служба получит сигнал о завершении — будь то выход из системы или остановка вручную.
Поскольку программа для скрипта является внешней (powershell.exe), то после выхода из цикла нам нужно закончить ее работу с помощью ProcessClose.
Для этого скрипт необходимо скомпилировать в .exe, а затем установить службу, запустив exe с ключом -i.
Оно работает!
Разумеется, этот способ не самый удобный, и все дополнительные возможности придется реализовывать самостоятельно, будь то повторный запуск приложения при сбое или ротация логов. Но зато он дает полный контроль над происходящим. Да и сделать в итоге можно куда больше — от уведомления в Telegram о сбое службы до IPC-взаимодействия с другими программами. И вдобавок — на скриптовом языке, без установки и изучения Visual Studio.
Можно ли запустить клиентское приложение в качестве службы? В одной из статей я описывал способы создания службы Windows штатными средствами ОС. Однако не каждое консольное приложение сможет запуститься как служба, а программы с графическим интерфейсом в принципе не умеют работать подобным образом. Но возможность запустить приложение как службу все же есть, и поможет нам в этом программа с оригинальным названием Non-Sucking Service Manager.
NSSM представляет из себя свободное программное обеспечение с открытым кодом и поддерживает все операционные системы Microsoft, начиная с Windows 2000 и заканчивая Windows 8. NSSM не требует установки, достаточно его загрузить и распаковать. В дистрибутив входят версии для 32- и 64-разрядных ОС. Взять программу можно с сайта nssm.cc, на данный момент последняя стабильная версия 2.21.1, которую я и буду использовать.
Для демонстрации возможностей NSSM попробуем запустить Блокнот Windows в качестве службы на Windows 8.1.
Создание службы
Для создания службы с именем notepad запускаем командную консоль, переходим в папку с распакованным NSSM (для 64-разрядной Windows) и вводим команду nssm install notepad , которая открывает окно графического инсталлятора NSSM. Чтобы создать службу, достаточно в поле Path указать путь к исполняемому файлу и нажать кнопку «Install service». Дополнительно в поле Options можно указать ключи, необходимые для запуска службы.
Также на этапе создания новой службы можно указать некоторые дополнительные параметры.
На вкладке «Shutdown» перечислены методы остановки и таймауты, используемые при штатном завершении работы или аварийной остановке приложения. Когда NSSM получает команду остановки (напр. при завершении работы приложения), то он пытается остановить контролируемое приложение штатным образом. Если же приложение не отвечает, то NSSM может принудительно завершить все процессы и подпроцессы этого приложения.
Всего есть четыре этапа завершения работы приложения, и по умолчанию они будет использоваться в таком порядке:
Возможно отключить некоторые или даже все методы, однако для разных приложений срабатывают разные методы и для корректного завершения работы приложения рекомендуется оставить все как есть.
По умолчанию при падении службы NSSM пытается рестартовать ее. На вкладке «Exit actions» можно изменить автоматическое действие при нештатном завершении работы приложения, а также выставить задержку перед автоматическим перезапуском приложения.
На вкладке «Input/Output (I/O)» можно задать перенаправление ввода\вывода приложения в указанный файл.
На вкладке «Environment» можно задать для службы новые переменные окружения, или переопределить существующие.
Также можно не пользоваться графической оболочкой и сразу создать службу в консоли такой командой:
nssm install notepad ″C:\Windows\system32\notepad.exe″
Управление службой
После создания службы с помощью NSSM зайдем в оснастку Services и найдем службу notepad. Как видите, с виду она ничем не отличается от остальных служб, мы также можем ее запустить, остановить или изменить режим запуска. Однако обратите внимание, что в качестве исполняемого файла указан nssm.exe.
А если зайти в Task Manager, то мы увидим следующую картину: в качестве основного (родительского) процесса запущен NSSM, служба notepad запущена как его дочерний процесс, и уже в этом дочернем процессе запущено приложение Блокнот.
Удаление службы
Для удаления службы вводим команду nssm remove notepad и подтверждаем ее удаление. А введя команду nssm remove notepad confirm , можно обойтись и без подтверждения.
Запуск службы в интерактивном режиме
А дело в том, что для ее запуска необходимо разрешить запуск интерактивных служб на компьютере. Поэтому открываем редактор реестра, находим в разделе HKLM\System\CurrentControlSet\Control\Windows параметр типа DWORD с именем NoInteractiveServices и ставим его значение в 0.
После чего открываем консоль PowerShell и стартуем службу обнаружения командой:
Start-Service -Name ui0detect
и попадаем в нулевой сеанс, в котором работает наше приложение. Дальше производим с ним необходимые действия и возвращаемся обратно.
Такое вот интересное решение для запуска приложений в виде служб Windows. Не самое красивое, но вполне соответствующее своему названию 🙂
1. История проекта
В обычном процессе разработки часто встречается, что консольное приложение Windows закрывается другими людьми после того, как оно запущено на рабочем столе или скрыто. Смущение, которое делает приложение неспособным продолжать, и в конечном счете приводит к потере данных. Тогда гораздо более научным является настроить консольную программу Windows для запуска в службе Windows. Это не будет закрыто не относящимися к делу факторами. Мы также можем настроить службу Windows, проверить в режиме реального времени и автоматически перезапустить, если она закрыта.
Во-вторых, консольная программа Windows настроена для запуска на службе Windows.
1. Добавьте службы Windows в консольное приложение. Щелкните правой кнопкой мыши по проекту - «Новый элемент -» Windows Service, нажмите «Добавить», чтобы добавить файл Service1.cs в проект.
2. Настройте код службы Windows.
Дважды щелкните добавленный файл Service1.cs, здесь я переименую Service1.cs в MQTTDataSync.cs, то же самое ниже.
Щелкните правой кнопкой мыши в пустом месте: «Просмотрите код, откройте средство просмотра кода, служба Windows автоматически генерирует два метода OnStart и OnStop, которые запускаются при открытии и завершении службы. Нам нужно вызвать наш метод бизнес-кода двумя методами. Кроме того, мы можем добавить название нашего сервиса ниже компонента инициализации, код выглядит следующим образом:
3. Добавьте установщик Windows.
Дважды щелкните, чтобы открыть службу [дизайн], щелкните правой кнопкой мыши в пустом месте - «добавить программу установки, система автоматически сгенерирует программу установки, нам нужно только настроить свойства программы установки:
Сначала щелкните serviceProcessInstaller1 левой кнопкой мыши, чтобы просмотреть и отредактировать свойства в правом нижнем углу. Здесь вам нужно изменить Account на LocalSystem. Кроме того, пользователи могут настроить имя:
Затем щелкните serviceInstaller1 левой кнопкой мыши, чтобы просмотреть атрибуты в правом нижнем углу и отредактировать их. Пользователь может редактировать такие атрибуты, как ServiceName, DisplayName и Description.
4. После завершения настройки установщика мы завершили настройку службы Windows. Но мы все знаем, что консольное приложение запускается из Program.cs. Как превратить исполнительную программу основной программы в исполнительную программу Windows-службы? Нам нужно внести следующие изменения в Program.cs:
Ранее мы добавили наш бизнес-метод в метод OnStart службы Windows, поэтому, когда служба Windows работает, мы можем напрямую вводить нашу бизнес-логику.
Читайте также: