Каковы практические применения Windows Services? [закрыто]


18

Я новичок в работе с Windows Services. Хотя я научился создавать службы Windows в VS2010, я хотел бы знать некоторые практические способы использования служб Windows?

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

РЕДАКТИРОВАТЬ на предложение Bounty:

Все ответы великолепны, но я искал более практичные примеры служб Windows и их последствия? Это поможет разработчикам узнать, когда уместно использовать их в тематическом исследовании.


28
Практические примеры? Как насчет каждого сервиса, работающего на вашем компьютере с Windows прямо сейчас?
Яннис

3
или каждый демон, работающий на вашем * nix box
jk.

1
Мне нравится записывать классическую музыку с эфирного радио. С программой мне нужно было вставать в 2 часа ночи и нажимать кнопку «запись». С помощью сервиса я могу заранее запланировать действия и спать спокойно. Программы телевизоры - услуги видеомагнитофонов.
Килиан Фот

Ответы:


42

Служба работает в фоновом режиме, даже если никто не вошел в систему на компьютере. Все, что вы можете себе представить, не желая, чтобы кто-то запускал приложение и нажимал кнопку, является хорошим кандидатом на услугу. Например, отслеживание папки и всякий раз, когда в нее записывается файл, обрабатывают его каким-либо образом. Любой «сервер», о котором вы только можете подумать - веб-сервер, FTP-сервер, почтовый сервер - это служба, и поэтому многие фоновые процессы вы не часто можете себе представить.

Некоторые вещи, которые когда-то были написаны как сервисы (резервные файлы в 2 часа ночи, отправка электронных писем с напоминаниями в 3 часа ночи и т. Д.), Вероятно, лучше выполнять сегодня как запланированные задачи, которые обладают огромной гибкостью в Windows 7 и более поздних версиях, но если разработчик их никогда не изучал или Система должна поддерживать XP, вы также найдете службы, выполняющие такие задачи.


1
+1. Отличный ответ. Ваш ответ напоминает мне о том, как я решил сделать резервную копию базы данных. Ранее для резервного копирования мы использовали для запуска процедуры SQL на сервере через планировщик, который вызывает exe. Exe раньше всплывал, а потом, как только сделал, закрывается сам по себе. Я думаю, что служба Windows была лучшим вариантом здесь.
Картик Сринивасан

8
Нет, не будет. Эта задача по-прежнему не нуждается в прослушивании соединений. Запланированные задачи являются правильным способом решения такого рода проблем.
Уайетт Барнетт

2
Я также запускал много запланированных задач на NTver <6.0. , ,
Уайетт Барнетт

1
@Polynomial: запланированные задачи могут выполняться под любой учетной записью, по крайней мере для любой NT5 +. Все, что работает без присмотра, должно вести журнал, чтобы вы могли понять, почему это не удалось.
Уайетт Барнетт

1
Отличное объяснение :). Наша текущая система обработки изображений в компании, в которой я работаю, широко использует службы Windows для обработки файлов. С момента сканирования изображений в систему до постановки в очередь для индексации в архивирование и, наконец, до вывода их по электронной почте, печати или факсу - все это службы Windows.
Келлистар

9

Сервисы в Windows - это программы, которые работают без графического интерфейса. Веб-серверы (такие как apache), серверы баз данных (такие как сервер mysql & sql), антивирусные ядра и серверы приложений / промежуточного программного обеспечения - все это практические примеры приложений, которые часто работают как сервисы. Может существовать GUI-клиент, позволяющий вам взаимодействовать со службой, но у самой службы его нет. Он просто работает "в фоновом режиме", делая свое дело. Кроме того, поскольку службы работают с назначенными им правами пользователей, они могут работать как назначенные им пользователи.действительно ли пользователь вошел в систему на компьютере. Таким образом, сервер базы данных будет иметь одинаковые права доступа независимо от того, кто в данный момент вошел в систему, если таковые имеются. Таким образом, вы можете понять, почему это важно - вы не хотите, чтобы пользователь оставался в системе, например, чтобы веб-сервер работал.

Они эквивалентны (в большинстве практических случаев) Windows демонам в * nix.


5

обслуживание

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

Я хотел бы знать некоторые практические способы использования служб Windows?

Согласно определению сервиса, Window Service и другие типы сервисов выполняют множество функций. В этом контексте поисковые системы - ваш друг .

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

Служба Windows будет работать, даже если никто не вошел в систему. Служба Windows может запускаться сразу после включения компьютера , что идеально подходит для работы в качестве сервера, например, http-сервера. Никто не обязан входить в систему.

Например, если им нужно:

  1. Ждите входящих запросов. (Как через удаленное взаимодействие или wcf)
  2. Мониторинг очереди, файловой системы и т. Д. Если программа просто должна запускаться периодически, например, один раз в день. Обычно проще создать запланированное задание.
  3. Любой сервер, который принимает соединения (например, почтовый, веб-или FTP-сервер), обычно должен быть Windows Service.

Я бы воспользовался сервисом по следующим причинам:

  • Вам не нужно запускать сеанс. Это хорошо для безопасности, а также снижает нагрузку на сервер.
  • Вы получаете некоторые встроенные команды управления бесплатно
    o Пуск
    o Остановить
    o Пауза
    o Продолжить

  • Вы можете обрабатывать события сервера, такие как завершение работы.

Ссылки с дополнительной информацией об этих услугах:

На Asp.net - // TODONT: используйте службу Windows только для запуска запланированного процесса.
Что такое служба WIndows?


Как запустить с наивысшими привилегиями службу Windows? Запланированные задачи, например, можно просмотреть stackoverflow.com/a/11561410/206730 . ИМХО, лучшие образцы для минимизации кривой обучения - это реальные приложения с полным исходным кодом и хорошими шаблонами
Kiquenet

4

Интерактивная программа, такая как winform или WPF, - это то, что вы хотите, чтобы пользователь открывал, взаимодействовал и закрывал. Запланированное задание - это то, что вы хотите запускать в фоновом режиме в определенное время - может быть, просто запустить, сделать что-нибудь и остановить. Службы Windows является то , что вы хотите работать все время в фоновом режиме.

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

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


3

Поскольку вы добавили примечание о практических примерах к своему вопросу, я приведу несколько примеров сервисов, которые я написал для корпоративных приложений (вы не говорите, если вы программист корпоративных приложений, но я предполагаю, что большинство программистов на C # VS2010 таковы) , Я думаю, что вы ищете идею о том, что могли бы написать разработчики, которые не работают на Microsoft.

Служба мониторинга сердцебиения, которая проверяла, все ли еще запущены другие программы (возможно, она работала и как запланированная задача, но была реализована как служба).

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

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

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

Надеюсь, это поможет. Другие ответы - это более общие общие ответы, особенно идея, что запланированные задачи, вероятно, легче написать и администрировать для большинства целей сейчас.


+1 Для объяснения, где службы Windows используются в деталях. У меня ограниченный доступ к сокетам (модель клиент-сервер, общение через IP-адрес через порты), но я вообще не использовал каналы. Трубы играют похожую роль, как розетки?
Картик Сринивасан

2

Есть много практических применений для службы. Одним из основных практических применений является взаимодействие между пользовательским интерфейсом и сервисными (или демонами в unix) программами, что в данном случае является разницей между клиентом и сервером. Сервер получает запросы, обрабатывает запрос и обычно отправляет ответ. Другими словами, он обслуживает запрос. Подумайте о SQLSERVER, IIS или telnet. Клиент, как правило, использует сервер, отправляя запросы на сервер и затем отображая или обрабатывая ответ. т.е. приложение для ввода данных, веб-приложение ... Сервер почти всегда устанавливается как служба в Windows (или демон в Unix), а клиент обычно является обычным приложением с графическим интерфейсом. Существует гораздо более сложное использование службы, но это, вероятно, вы будете использовать чаще всего.

Например: в настоящее время я работаю на видеосервере SIP / H323. Он получает запросы от приложения, используя SDK, который я написал, обрабатывает их и отвечает обратно. Приложение видеосервера устанавливается в качестве демона на встраиваемой машине Linux (это будет служба на встраиваемой машине Windows, но в любом случае использует Windows для встраивания), и любое приложение, использующее SDK, будет считаться клиентом.

Конечно, вы могли бы писать такие приложения, а не делать их сервисом. Вы по-прежнему можете запускать их при запуске Windows и запускать в фоновом режиме. Тем не менее, он включает в себя несколько записей реестра и некоторые ошибки в вашем коде - это гораздо проще сделать с помощью API, чем в чем-то вроде .NET. Microsoft, с другой стороны, сделала это намного проще, создав службы и разрешая нам регистрировать их в ОС. Это гораздо проще и проще реализовать, чем делать это вручную.


+1 - просто чтобы уточнить, служба размещается на сервере как служба Windows, а затем клиентский SDK отправляет информацию на сервер через порт для передачи данных для получения обратной связи. Правильно ли мое понимание?
Картик Сринивасан

1
@Kartik, Вы имеете в виду шаблон дизайна или мой пример? Если к первому, да .. или демон в Unix. Коммуникация была бы некоторой формой TCP / IP. Если вы ссылаетесь на мой пример, видеосервер является демоном на встроенной машине Linux. SDK связывается через порт, видеосервер имеет цикл прослушивания, который он использует для обработки клиентских запросов.
Джонатан Хенсон

@Kartik, кстати, это не обязательно TCP / IP или Pipes. Я видел, как люди используют сигналы со слотами для межпроцессного взаимодействия. Тем не менее, шаблон дизайна такой же. Как вы общаетесь, зависит от архитектора проекта.
Джонатан Хенсон

Я имел в виду пример.
Картик Сринивасан

2

Примеры программ-кандидатов:

  • Системы, которые должны отслеживать ресурсы / другие приложения и отправлять отчеты (активность пользователей, определенные виды файлового трафика, уведомления о неправильном поведении приложений)

  • Системы, которые предлагают услуги другим локальным приложениям (переводы, преобразование файлов, обмен сообщениями между системами)

  • Антивирусная программа.

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


+1 за примеры. Не могли бы вы рассказать о трафике файлов?
Картик Сринивасан

1
Например, если у вас есть веб-приложение, которое видит скачки в загрузках файлов, вы бы хотели предупредить кого-либо из них. Кроме того, это относится к любому ресурсу, который может видеть пики в странные моменты времени (например, веб-трафик, использование процессора), которые не могут быть обнаружены запланированными проверками (из-за наложения имен).
linkerro

2

Мои любимые примеры использования сервисов:

  1. Серверы - программы, обслуживающие запросы от удаленных клиентов. Они обычно запускаются как службы, чтобы убедиться, что они доступны, независимо от того, вошел ли пользователь на сервер или нет. Запуск в качестве службы также означает, что сервер начинает обрабатывать запросы, как только машина запускается, никто не должен входить в систему на компьютере, чтобы запустить программу после перезапуска машины по любой причине. Сервер базы данных - отличный пример.
  2. Фоновая обработка - программы, которые отвечают за обработку данных из источника данных и сохранение результатов в целевом объекте данных. Целевой объект данных часто является источником для другого процесса и т. Д. Запуск в качестве служб позволяет этим программам просто сидеть и ждать поступления данных. Это также позволяет разработчикам повысить надежность обработки, разделив процесс на несколько полунезависимых этапов.

+1 для сервера базы данных. Вещи падают на месте. Мы все используем SqlConnection или OledbConnection для подключения к базе данных, которая фактически обрабатывается службой, которая находится на сервере.
Картик Сринивасан

2

Вот пример использования концепции сервиса с реальным кодом (см. Ниже).

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

Получая сообщения, он выполняет ту логику, которую требует домен, он сохраняет события на диск и публикует эти события в брокере сообщений.

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

Проект Documently - это пример проекта, который мы создали для людей, подобных вам, для изучения распределенных архитектур. Вы можете задавать вопросы непосредственно мне в проекте, или разветвлять его и реализовать какую-то функцию для изучения, а затем отправить запрос на извлечение (и получить комментарии к коду).

https://github.com/haf/Documently/blob/master/src/Documently.Domain.Service/Program.cs :

using System.Threading;
using Castle.MicroKernel.Registration;
using Castle.Windsor;
using Documently.Infrastructure;
using Documently.Infrastructure.Installers;
using MassTransit;
using Topshelf;
using log4net;
using log4net.Config;

namespace Documently.Domain.Service
{
    class Program
    {
        private static readonly ILog _Logger = LogManager.GetLogger(typeof (Program));

        private IWindsorContainer _Container;
        private IServiceBus _Bus;

        public static void Main(string[] args)
        {
            Thread.CurrentThread.Name = "Domain Service Main Thread";
            HostFactory.Run(x =>
            {
                x.Service<Program>(s =>
                {
                    s.ConstructUsing(name => new Program());
                    s.WhenStarted(p => p.Start());
                    s.WhenStopped(p => p.Stop());
                });
                x.RunAsLocalSystem();

                x.SetDescription("Handles the domain logic for the Documently Application.");
                x.SetDisplayName("Documently Domain Service");
                x.SetServiceName("Documently.Domain.Service");
            });
        }

        private void Start()
        {
            XmlConfigurator.Configure();
            _Logger.Info("setting up domain service, installing components");

            _Container = new WindsorContainer()
                .Install(
                    new RavenDbServerInstaller(),
                    new CommandHandlerInstaller(),
                    new EventStoreInstaller(),
                    new BusInstaller(Keys.DomainServiceEndpoint)
                    );

            _Container.Register(Component.For<IWindsorContainer>().Instance(_Container));
            _Bus = _Container.Resolve<IServiceBus>();

            _Logger.Info("application configured, started running");
        }

        private void Stop()
        {
            _Logger.Info("shutting down Domain Service");
            _Container.Release(_Bus);
            _Container.Dispose();
        }
    }
}

+1 для иллюстрации на примере. Я постараюсь реализовать ваш пример, чтобы лучше понять.
Картик Сринивасан

2

Некоторое время назад моя команда внедрила 3 ​​службы Windows в банке здесь, в Бразилии, как показано ниже:

  • Интерфейс между системами: у нас было приложение для фронт-офиса, отвечающее за бронирование сделок на фондовом рынке, и приложение для бэк-офиса, отвечающее за учет и расчет комиссий за торги. Первоначально межсистемная связь осуществлялась непосредственно на SQL Server, но слишком много проблем с блокировкой и хранением приводили к тому, что система страдала от низкой производительности. Был реализован сервис для подключения к передней и задней базам данных и для правильного чтения / записи с использованием некоторой стратегии хранения (вместо записи каждой отдельной сделки на SQL Server, мы храним данные до некоторой степени, скажем, 1000 сделок, и выполнил массовую вставку, которая была в 40 раз быстрее, чем исходное решение, и долго не блокировал многие из задействованных таблиц).

  • Очередь сообщений. Наряду с предыдущим решением мы написали собственный обработчик очереди сообщений, чтобы несколько процедур пакетной обработки могли выполняться асинхронно. Это было интегрировано с MSMQ и IBM-MQSeries.

  • Централизация бизнес-сервисов. Например, нескольким пользовательским приложениям требовались общие данные в виде цен на акции, поэтому мы написали специальный сервис, отвечающий за получение «ценовых запросов» и отправку информации о ценах.

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

Службам также не требуется рабочий стол или служба управления окнами. Они могут работать на фоне (ну, они должны работать на фоне).

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


+1 Живой пример. Из всех хороших ответов, предоставленных всеми здесь, я теперь лучше понимаю правильное использование служб Windows, и я думаю, что другие программисты определенно выиграют от обмена знаниями здесь. Некоторые из реализаций, с которыми я работал в прошлом, могли бы быть лучше реализованы с использованием служб Windows.
Картик Сринивасан

0

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

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

Этот подход имеет последствия для безопасности, которые выходят за рамки этого ответа.


Если я правильно понимаю, службы Windows не могут быть вызваны без разрешения администратора?
Картик Сринивасан

2
Нет, службы Windows не могут быть установлены или запущены без прав администратора. Но любой пользователь может общаться с ними, если служба прослушивает (например, сокеты, именованные каналы и т. Д.)
Eclipse

1
Конечно, обычный пользователь может запустить и вызвать службу Windows. Служба должна быть установлена ​​администратором.
Джим в Техасе

0

Для программистов основная причина использования сервиса:

  • Эта программа должна автоматически запускаться на компьютере с Windows после перезагрузки.

Все, что вы пишете, должно соответствовать вышеприведенному, должно работать как служба Windows.


0

Самая полезная услуга, которую я написал, с точки зрения конечного пользователя:
* Пользователь печатал счета UGLY на матричном принтере с драйвером печати RAW.
* Пользователь хотел выставить счет-фактуру PRETTY с логотипом и плавной графикой.
* Нет доступа к устаревшему коду.

Служба будет:
* Контролировать (несколько) папок принтера для заданий на печать.
* Создайте PDF счета.
* PDF будет «лежать под» красивым пустым изображением счета-фактуры.
* Наложить необработанный текст.
* Искать метаданные на основе используемой папки (IE: используется принтер).

Затем метаданные будут:
* Создавать PDF
* и / или печатать PDF
* и / или подайте PDF в конечную папку назначения
* и / или удалите PDF
* и / или отправьте счет в формате PDF клиенту

В этом случае он обрабатывает ghost-script, PLC и движки PDF. Он работает очень чисто в течение многих лет. Включите файлы журнала !!!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.