консольное приложение как служба

Пилим свою службу Windows – руководство для «не настоящих программистов»

консольное приложение как служба. j3j57big8bze9751j7 frrcjc7q. консольное приложение как служба фото. консольное приложение как служба-j3j57big8bze9751j7 frrcjc7q. картинка консольное приложение как служба. картинка j3j57big8bze9751j7 frrcjc7q.

Однажды вы задумаетесь, как превратить скрипт или приложение в Windows-службу. Скорее всего, задача окажется не такой уж тривиальной – приложению как минимум потребуется специальный интерфейс для получения команд от системы. А раз есть требования и ограничения, то есть и скрипты, и милые сердцу костылики для преодоления.

Статья будет полезна тем, кто, как и я — «программист не настоящий».

Зачем нужна служба, если есть назначенные задания

В отличие от назначенных заданий служба работает постоянно, запускается при старте ПК и может управляться средствами Windows. А еще регулярно запускаемому скрипту могут понадобиться данные с предыдущего запуска, и может быть полезно получение данных из внешних источников — например, в случае TCP или Web сервера.

Лично мне за последние пять лет приходилось создавать службу три с половиной раза:

Для создания службы можно использовать взрослые языки программирования вроде 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 он будет выглядеть так:

консольное приложение как служба. 2c9azwf tlvz6cs2ez4jlw7pl58. консольное приложение как служба фото. консольное приложение как служба-2c9azwf tlvz6cs2ez4jlw7pl58. картинка консольное приложение как служба. картинка 2c9azwf tlvz6cs2ez4jlw7pl58.
Настроенная служба.

Можно запустить и радоваться.

консольное приложение как служба. 4jqhkdbgssb6gv8el qpnfn4wea. консольное приложение как служба фото. консольное приложение как служба-4jqhkdbgssb6gv8el qpnfn4wea. картинка консольное приложение как служба. картинка 4jqhkdbgssb6gv8el qpnfn4wea.
Работающая служба.

Однако у этого способа есть недостатки:

Поэтому перейдем к методу, частично лишенному этих проблем.

Способ второй, почти взрослый

Существует утилита под названием NSSM — Non-Sucking Service Manager, что можно перевести как не-плохой менеджер служб. В отличие от предыдущей, она поддерживается разработчиком, и исходный код опубликован на сайте. Помимо обычного способа, доступна и установка через пакетный менеджер Chocolately.

Создать сервис можно из обычной командной строки, вооружившись документацией на сайте разработчика. Но мы воспользуемся PowerShell. Потому что можем, разумеется.

консольное приложение как служба. . консольное приложение как служба фото. консольное приложение как служба-. картинка консольное приложение как служба. картинка .
Установка через PowerShell.

Для разнообразия проверим работу службы не браузером, а тоже через PowerShell командой Invoke-RestMethod.

консольное приложение как служба. image loader. консольное приложение как служба фото. консольное приложение как служба-image loader. картинка консольное приложение как служба. картинка image loader.
И вправду работает.

В отличие от srvany, этот метод позволяет перезапускать приложение на старте, перенаправлять stdin и stdout и многое другое. В частности, если не хочется писать команды в командную строку, то достаточно запустить GUI и ввести необходимые параметры через удобный интерфейс.

GUI запускается командой:

консольное приложение как служба. . консольное приложение как служба фото. консольное приложение как служба-. картинка консольное приложение как служба. картинка .
Настроить можно даже приоритет и использование ядер процессора.

Действительно, возможностей куда больше, чем у srvany и ряда других аналогов. Из минусов бросается в глаза недостаточный контроль над всем процессом.

Налицо нехватка «жести». Поэтому я перейду к самому хардкорному методу из всех опробованных.

Способ третий. AutoIT

Поскольку я давний любитель этого скриптового языка, то не смог пройти мимо библиотеки под названием _Services_UDF v4. Она снабжена богатой документацией и примерами, поэтому под спойлером сразу приведу полный текст получившегося скрипта.

Итак, попробуем «завернуть» в нее наш веб-сервис:

Разберу подробнее момент запуска приложения. Он начинается после операции $bServiceRunning = True и превращается в, казалось бы, бесконечный цикл. На самом деле этот процесс прервется, как только служба получит сигнал о завершении — будь то выход из системы или остановка вручную.

Поскольку программа для скрипта является внешней (powershell.exe), то после выхода из цикла нам нужно закончить ее работу с помощью ProcessClose.

Для этого скрипт необходимо скомпилировать в .exe, а затем установить службу, запустив exe с ключом -i.

консольное приложение как служба. . консольное приложение как служба фото. консольное приложение как служба-. картинка консольное приложение как служба. картинка .
Оно работает!

Разумеется, этот способ не самый удобный, и все дополнительные возможности придется реализовывать самостоятельно, будь то повторный запуск приложения при сбое или ротация логов. Но зато он дает полный контроль над происходящим. Да и сделать в итоге можно куда больше — от уведомления в Telegram о сбое службы до IPC-взаимодействия с другими программами. И вдобавок — на скриптовом языке, без установки и изучения Visual Studio.

Расскажите, а вам приходилось превращать скрипты и приложения в службы?

Источник

Запустите консольное приложение как службу

Как я могу запустить его как службу, пожалуйста, помогите мне. Заранее спасибо сангита

4 ответа

И добавьте свой основной код в обработчики событий OnStart () и OnStop (), затем установите его как службу:

Я только что протестировал это в Visual Studio 2013, и он работает.

Вот как выглядит мой Program.cs:

Вы можете добавить установку службы вот так

Вы можете установить службу с помощью этой команды: installutil.exe /i YouExeName.exe

Вы можете удалить службу с помощью этой команды: installutil.exe /u YouExeName.exe

Environment.UserInteractive имеет значение false только тогда, когда он фактически работает как служба. Когда вы дважды щелкаете по нему или запускаете из Visual Studio; он работает как обычное консольное приложение, и ему доступен рабочий стол, поэтому Environment.UserInteractive истинно.

Чтобы создать консольное приложение, которое также может работать как служба Windows.

Главный файл

Вспомогательные файлы

Как установить как службу Windows

Как я создал этот код

Похоже, много кода, но все это основано на шаблоне проекта Windows Service в Visual Studio 2012. Я создал новую службу Windows, а затем использовал Environment.UserInteracive для переключения между консолью и службой. Я добавил CancellationTokens, чтобы убедиться, что, если служба была остановлена, задача также остановилась бы быстро (даже если бы она была с задержкой).

консольное приложение как служба. waLG4. консольное приложение как служба фото. консольное приложение как служба-waLG4. картинка консольное приложение как служба. картинка waLG4.

Вот необходимые дополнительные ссылки (они добавляются автоматически при создании новой службы Windows с использованием шаблона):

Источник

Devetime

консольное приложение как служба. %D0%98%D0%B7 %D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B %D1%81%D0%BB%D1%83%D0%B6%D0%B1%D1%83. консольное приложение как служба фото. консольное приложение как служба-%D0%98%D0%B7 %D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B %D1%81%D0%BB%D1%83%D0%B6%D0%B1%D1%83. картинка консольное приложение как служба. картинка %D0%98%D0%B7 %D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B %D1%81%D0%BB%D1%83%D0%B6%D0%B1%D1%83.

Программа как служба или как превратить любую программу в службу на Windows

Папки:
scr – папка с исходниками программы, вдруг вы захотите покапаться во внутренностях программы или переделать ее под себя.
win32 – папка с программой рассчитанной под операционную систему windows разрядностью 32 бита.
win64 – папка с программой рассчитанной под операционную систему windows разрядностью 64 бита.

Файлы:
ChangeLog.txt – файл с описанием изменений каждой версии программы.
README.txt – файл с описанием программы.

Теперь, когда мы познакомились с содержимым архива, приступим к установке. В зависимости от разрядности вашей системы 32/64 бита, выбираем папку с программой.(Если у вас разрядность системы 32 бита то выбираем win32, если 64 то win64). Переносим эту папку в корень диска с операционной системой(Желательно), и запускаем командную строку(Вызвать ее можно комбинацией клавиш Win+R, и в сплывающем окне набрать cmd и нажать OK)
консольное приложение как служба. winr. консольное приложение как служба фото. консольное приложение как служба-winr. картинка консольное приложение как служба. картинка winr.
консольное приложение как служба. 2018 09 05 22 49 58 e1536177337315. консольное приложение как служба фото. консольное приложение как служба-2018 09 05 22 49 58 e1536177337315. картинка консольное приложение как служба. картинка 2018 09 05 22 49 58 e1536177337315.

Откроется командная строка,и в ней набираем команду cd и путь к программе nssm. Например:

Далее набираем команду – nssm install + имя будущей службы. Например:

И перед нами предстает окно программы nssm.

консольное приложение как служба. 2018 09 06 21 15 05 e1536257801244. консольное приложение как служба фото. консольное приложение как служба-2018 09 06 21 15 05 e1536257801244. картинка консольное приложение как служба. картинка 2018 09 06 21 15 05 e1536257801244.

Расскажу коротко о настройках которые нам потребуются.

Path – в этом поле указываем путь к программе которую мы хотим переделать в службу(Обязательно).
Startup directory – директория нахождения программы(Обязательно).
Arguments – дополнительные параметры запуска программы(Не обязательно).
Service name – наименование будущей службы(Можно назвать как угодно, хоть MEGASLUZBA).

На этом в принципе все, дополнительных настроек не требуется.
После всех настроек нажимаем кнопку install service и запускаем диспетчер задач и наблюдаем нашу службу.
консольное приложение как служба. 2018 09 06 21 33 51. консольное приложение как служба фото. консольное приложение как служба-2018 09 06 21 33 51. картинка консольное приложение как служба. картинка 2018 09 06 21 33 51.
Перезагрузите компьютер, или запустите службу вручную из диспетчера задач. (Правой кнопкой мыши по службе – запустить)

P.S.на всякий случай,если у вас не работает стабильно ваша программа, то в разделе process, уберите галочку Console Windows.
консольное приложение как служба. 2018 09 06 21 21 47. консольное приложение как служба фото. консольное приложение как служба-2018 09 06 21 21 47. картинка консольное приложение как служба. картинка 2018 09 06 21 21 47.

Что бы внести изменения в вашу службу, запустите командную строку и введите команду: nssm edit + название вашей службы

Источник

Запуск консольного приложения c# в качестве службы Windows

у меня есть базовое консольное приложение c#, которое я хотел бы запустить как службу Windows.

не удалось запустить службу проекта на локальном компьютере. Ошибка 1053: служба не ответила на запрос запуска или управления своевременно.`

Я читал это может быть связано с тем, что код службы занимает больше времени, чем 30000 мс для выполнения. Поэтому я удалил основную часть кода, так что почти ничего не выполняется.. однако та же ошибка сохраняется.

что может быть причиной?

6 ответов

В идеале вы также должны добавить ServiceInstaller в свою сборку. Таким образом, Вы сможете предустановить свои свойства сервиса и использовать installutil.exe для установки услуга.

не любое старое приложение может быть запущено как служба, особенно в более поздних версиях Windows. Ожидается, что они будут поддерживать определенные функции, отвечать на определенные запросы и (опять же, в последних версиях Windows) не взаимодействовать с пользователем напрямую.

Если вам нужна служба, напишите приложение, специально разработанное для службы.

Я не знаю, что такое «sc create». Но я знаю, что с помощью Visual Studio 2010 можно создать проект службы Windows. Кстати, я создал проект такого рода, и он работает хорошо на всем пути.

(к сожалению, я пока не могу написать комментарий.) Это связано с тем, что SCM (Service Control Manager) управляет классом ServiceBase службы через ServiceBase. Если бы только нужно было определить, что он делает, когда он запускается и останавливается, не будет необходимости в наследовании и переопределении. Можно просто создать эти два метода. К сожалению, есть немного больше работы, потому что например содержит немного больше функций.

Источник

Запуск службы Windows в качестве консольного приложения

Я хочу отладить службу Windows, но появляется сообщение об ошибке

Не удается запустить службу из командной строки или отладчика. служба Windows должен быть установлен с помощью программы installutil.exe, а затем началось с обозреватель серверов, службы windows Средства администрирования или NET start команда.

Я действительно понятия не имею об этой ошибке.

консольное приложение как служба. 3836f8fddf6f83fe26f3c94dca2dcb5f. консольное приложение как служба фото. консольное приложение как служба-3836f8fddf6f83fe26f3c94dca2dcb5f. картинка консольное приложение как служба. картинка 3836f8fddf6f83fe26f3c94dca2dcb5f.

4 ответов

прежде чем служба Windows может работать, она должна быть» установлена » сначала с помощью installutil. Например:

затем вы можете открыть список служб, чтобы запустить его. Например:

после запущенный, вы можете войти в Visual Studio, нажмите «отладка», затем нажмите «прикрепить к процессу».

другой метод-добавить эту строку в метод OnStart () в сервисе:

когда вы это сделаете,он предложит вам выбрать экземпляр Visual Studio для отладки службы.

вы можете изменить режим запуска сборки в зависимости от того, находитесь ли вы в режиме отладки (обычно внутри Visual Studio, но не обязательно) или в режиме выпуска (когда он работает как Служба в производстве):

техника взята из в этой статье и заслуга автора статьи, Tejas Vaishnav. Я скопировал фрагменты кода здесь, потому что так предпочитает полные ответы, а не ссылки, которые может, когда-нибудь исчезнет.

пожалуйста, проверьте, находитесь ли вы в режиме» DEBUG «или» RELEASE». Я получил эту ошибку, когда пытался отладить службу в режиме» RELEASE». Когда я изменил это на «DEBUG», все работало нормально.

Это после того, как вы правильно установили службу, как это было предложено другими людьми выше.

чтобы предотвратить эту ошибку и позволить службе работать вне обычного контроллера службы, вы можете проверить Environment.UserInteractive флаг. Если он установлен, вы можете запустить службу с выводом на консоль, а не запускать ее в код ServiceBase, который возвращает эту ошибку.

добавьте это в начало программы.Main (), перед кодом, использующим ServiceBase для запуска службы:

как onStart и OnStop методы являются protected в сервис вам нужно чтобы добавить другой метод к этому классу, который вы можете запустить из Main () и вызывает эти методы для вас, такие как:

наконец, убедитесь, что вывод является консольным приложением в свойствах проекта.

теперь вы можете запустить исполняемый файл службы, как и любой другой, и он начнется как консоль. Если вы запустите его из Visual Studio, отладчик подключится автоматически. Если вы зарегистрируете его и запустите как службу, он будет работать правильно как Служба без каких-либо изменения.

единственное отличие, которое я нашел, заключается в том, что при запуске в качестве консольного приложения код не записывается в журнал событий, вы можете захотеть вывести все, что вы обычно регистрируете там на консоли.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *