Jakie są praktyczne zastosowania usług systemu Windows? [Zamknięte]


18

Jestem nowy w pracy z usługami Windows. Chociaż nauczyłem się tworzyć usługi Windows w VS2010 , chciałbym poznać kilka praktycznych sposobów korzystania z usług Windows?

Próbowałem googlingu z myślą o bieżącym kontekście, aby znaleźć więcej samouczków na temat tworzenia usług systemu Windows.

EDYCJA w sprawie oferty nagród:

Wszystkie odpowiedzi są świetne, ale szukałem bardziej praktycznych przykładów usług Windows i ich implikacji? Pomoże to programistom dowiedzieć się, kiedy należy wykorzystać je w studium przypadku.


28
Praktyczne przykłady? Co powiesz na każdą usługę działającą teraz na twoim systemie Windows?
yannis

3
lub każdego demona działającego na twoim * nix boxie
jk.

1
Lubię nagrywać muzykę klasyczną z radia. Z programem musiałbym wstać o 2 nad ranem i nacisnąć przycisk „nagrywaj”. Dzięki usłudze mogę wcześniej zaplanować akcję i spokojnie spać. Programy to telewizory - usługi to magnetowidy.
Kilian Foth,

Odpowiedzi:


42

Usługa działa w tle, nawet jeśli nikt nie jest zalogowany na komputerze. Wszystko, co możesz sobie wyobrazić, chcąc zrobić bez polegania na osobie, która uruchomi aplikację i kliknie przycisk, jest dobrym kandydatem do usługi. Na przykład monitorowanie folderu i za każdym razem, gdy plik jest do niego zapisywany, należy go w jakiś sposób przetworzyć. Każdy „serwer”, o którym możesz pomyśleć - serwer WWW, serwer ftp, serwer poczty - jest usługą, podobnie jak wiele procesów w tle, o których często nie myślisz.

Niektóre rzeczy, które kiedyś były pisane jako usługi (tworzenie kopii zapasowych plików o 2 nad ranem, wysyłanie e-maili z przypomnieniami o 3 nad ranem itp.) Są prawdopodobnie lepiej wykonywane dzisiaj jako zaplanowane zadania, które mają ogromną elastyczność w systemie Windows 7 i nowszych, ale jeśli deweloper nigdy się ich nie nauczył lub system musi obsługiwać XP, znajdziesz również usługi wykonujące tego rodzaju zadania.


1
+1. Świetna odpowiedź. Twoja odpowiedź przypomina mi, jak rozwiązałem tworzenie kopii zapasowej bazy danych. Wcześniej, aby wykonać kopię zapasową, uruchomiliśmy procedurę SQL na serwerze za pomocą harmonogramu, który wywołuje exe. Plik exe pojawiał się, a po zakończeniu sam się zamyka. Myślę, że lepszym rozwiązaniem była usługa Windows.
Karthik Sreenivasan

8
Nie, nie miałby. To zadanie wciąż nie musi nasłuchiwać połączeń. Zaplanowane zadania to właściwy sposób rozwiązania tego rodzaju problemu.
Wyatt Barnett

2
Miałem też wiele zaplanowanych zadań na NTver <6.0. . .
Wyatt Barnett

1
@Polynomial: Zaplanowane zadania mogą być uruchamiane na dowolnym koncie, przynajmniej dla dowolnego NT5 +. Wszystko, co działa nienadzorowane, musi rejestrować, aby można było dowiedzieć się, dlaczego nie powiodło się.
Wyatt Barnett

1
Świetne wyjaśnienie :). Nasz obecny system obrazowania w firmie, w której pracuję, korzysta z usług Windows w szerokim zakresie do przetwarzania plików. Od momentu zeskanowania obrazów do systemu do kolejkowania w celu indeksowania do archiwizacji, a następnie do wysłania ich pocztą e-mail, drukowania lub faksu, są to wszystkie usługi systemu Windows.
kelleystar

9

Usługi w systemie Windows to w zasadzie programy działające bez graficznego interfejsu użytkownika. Serwery WWW (takie jak apache), serwery baz danych (takie jak serwer mysql i sql), silniki antywirusowe oraz serwery aplikacji / oprogramowania pośredniego to praktyczne przykłady aplikacji, które często działają jako usługi. Może istnieć klient GUI umożliwiający interakcję z usługą, ale sama usługa nie ma takiego. Po prostu działa „w tle” i robi swoje. Ponadto, ponieważ usługi działają z przypisanymi im uprawnieniami użytkownika, mogą działać jako przypisany użytkownikczy użytkownik jest faktycznie zalogowany na komputerze. Tak więc serwer bazy danych miałby takie same prawa dostępu, niezależnie od osoby zalogowanej w danym momencie na maszynie, jeśli taka istnieje. Możesz więc zrozumieć, dlaczego jest to ważne - na przykład nie chcesz, aby użytkownik był zalogowany, aby serwer WWW działał.

Są to odpowiedniki systemu Windows (w najbardziej praktycznych przypadkach) dla demonów na * nix.


5

Usługa

Program, procedura lub proces, który wykonuje określoną funkcję systemową w celu obsługi innych programów, szczególnie na niskim poziomie (blisko sprzętu). Usługi świadczone przez sieć mogą być publikowane w usłudze Active Directory, co ułatwia administrację i korzystanie z usług.

Chciałbym poznać praktyczne sposoby korzystania z usług Windows?

Zgodnie z definicją usługi, Windows Service i inne rodzaje usług pełnią wiele funkcji. W tym kontekście wyszukiwarki są Twoim przyjacielem .

Usługi systemu Windows są zwykle używane, gdy aplikacja wymaga ciągłego działania. Należy utworzyć usługę systemu Windows, aby uruchomić kod w tle, bez interakcji użytkownika .

Usługa systemu Windows będzie działać, nawet jeśli nikt nie jest zalogowany. Usługa Windows może zacząć działać, gdy tylko urządzenie zostanie włączone , co idealnie nadaje się do działania jako serwer, na przykład serwer http. Nikt nie jest zobowiązany do logowania.

Na przykład, jeśli muszą:

  1. Poczekaj na przychodzące żądania. (Jak przez zdalne lub wcf)
  2. Monitoruj kolejkę, system plików itp. Jeśli program wymaga tylko okresowego uruchamiania, np. Raz dziennie. Zazwyczaj łatwiej jest utworzyć zaplanowane zadanie.
  3. Każdy serwer, który akceptuje połączenia (taki jak serwer poczty, sieci lub FTP), powinien zwykle być usługą systemu Windows.

Chciałbym skorzystać z usługi z następujących powodów:

  • Nie musisz mieć uruchomionej sesji. Jest to dobre dla bezpieczeństwa, a także zmniejsza obciążenie serwera.
  • Niektóre z wbudowanych poleceń zarządzania są dostępne za darmo
    o Start
    o Stop
    o Pauza
    o Kontynuuj

  • Możesz obsługiwać zdarzenia serwera, takie jak zamknięcie.

Linki z dodatkowymi informacjami na temat tych usług:

W Asp.net - // TODONT: Użyj usługi Windows, aby uruchomić zaplanowany proces. Co to jest korzystanie z usługi Windows


Jak uruchomić z najwyższymi uprawnieniami usługę Windows? Zaplanowane zadania, na przykład, można przeglądać stackoverflow.com/a/11561410/206730 . IMHO, lepsze próbki w celu zminimalizowania krzywej uczenia się to prawdziwe aplikacje z pełnym kodem źródłowym i dobrymi wzorami
Kiquenet

4

Program interaktywny, taki jak winform lub WPF, to coś, co użytkownik chce otwierać, wchodzić w interakcje i zamykać. Zaplanowane zadanie to coś, co chcesz uruchomić w tle jako określony czas - może po prostu uruchom, zrób coś i przestań. Usługi Windows jest coś chcesz uruchomić cały czas w tle.

Niektóre zalety usługi systemu Windows polegają na tym, że działa ona niezależnie od tego, który użytkownik jest zalogowany (lub nawet jeśli żaden użytkownik nie jest zalogowany), i można ją ustawić tak, aby uruchamiała się natychmiast po uruchomieniu komputera, co może być naprawdę przydatne, jeśli system zostanie zrestartowany.

Zwykle korzystałem z usług, gdy muszę monitorować coś takiego jak folder lub skrzynka odbiorcza e-mail.


3

Ponieważ dodałeś notatkę o praktycznych przykładach do swojego pytania, dam ci kilka przykładów usług, które napisałem dla aplikacji korporacyjnych (nie mówisz, że jesteś programistą aplikacji korporacyjnych, ale domyślam się, że większość programistów C # VS2010 jest) . Myślę, że szukasz pomysłu na to, co mogą napisać programiści, którzy nie pracują dla Microsoft.

Usługa monitorowania pulsu, która sprawdza, czy inne programy nadal działają (mogło to również działać jako zaplanowane zadanie, ale zostało zaimplementowane jako usługa).

Usługa pisania raportów, która działała przez kolejki żądań raportów, uruchamiała raporty i wysyłała je do różnych drukarek, w zależności od tego, która drukarka była zajęta. Pomogło to w odciążeniu starszej aplikacji i pozwoliło na udostępnienie uruchomionego raportu przez wiele tanich urządzeń obsługujących tę usługę.

Został zaimplementowany jako usługa, dzięki czemu będzie działał w sposób ciągły, uruchamiał się automatycznie po ponownym uruchomieniu i mógł używać standardowego interfejsu usług systemu Windows do uruchamiania, zatrzymywania, wstrzymywania itp. Ponadto, jeśli było to zaplanowane zadanie, musiałoby inicjować pobieranie danych z innych programów lub trwałego źródła (kolejki, pliku, bazy danych) zamiast być dostępnym dla innych programów do wywołania (gniazdo, potok).

Część serwerowa tej aplikacji klient / serwer została również zaimplementowana jako usługa, aby mogła zostać zrestartowana przy ponownym uruchomieniu, itp. Był inny projekt z rozszerzeniem .exe, który uruchamiał ten sam program nie jako usługa, aby ułatwić debuguj na maszynach programistycznych.

Mam nadzieję że to pomogło. Inne odpowiedzi są jednak lepszymi odpowiedziami ogólnymi, szczególnie pomysł, że zaplanowane zadania są teraz prawdopodobnie łatwiejsze do pisania i administrowania w większości celów.


+1 Do szczegółowego wyjaśnienia, gdzie używane są usługi systemu Windows. Mam ograniczoną ekspozycję na gniazda (model klient-serwer komunikuje się za pośrednictwem adresu IP przez porty), ale ogólnie nie korzystałem z potoków. Czy rury mają podobną rolę do odegrania jak gniazda?
Karthik Sreenivasan

2

Istnieje wiele praktycznych zastosowań usługi. Jednym z głównych praktycznych zastosowań jest interakcja między interfejsem użytkownika a programami usługowymi (lub demonem w unixie), co w tym przypadku stanowi różnicę między klientem a serwerem. Serwer odbiera żądania, przetwarza je i zwykle odsyła odpowiedź. Innymi słowy, SŁUŻY żądanie. Pomyśl o SQLSERVER, IIS lub telnet. Klient zwykle korzysta z serwera, wysyłając żądania do serwera, a następnie wyświetlając lub przetwarzając odpowiedź. tj. aplikacja do wprowadzania danych, aplikacja internetowa ... Serwer prawie zawsze jest instalowany jako usługa w systemie Windows (lub demon w systemie Unix), a klient jest zwykle zwykłą aplikacją z GUI. Istnieje wiele bardziej złożonych zastosowań usługi, ale prawdopodobnie z tej najczęściej będziesz korzystać.

Na przykład: Aktualnie pracuję na serwerze wideo SIP / H323. Odbiera żądania z aplikacji za pomocą zestawu SDK, który napisałem, przetwarza je i odpowiada z powrotem. Aplikacja serwera wideo jest instalowana jako demon na wbudowanym komputerze z systemem Linux (byłaby to usługa na wbudowanym komputerze z systemem Windows, ale i tak używa systemu Windows do osadzania), a każda aplikacja korzystająca z zestawu SDK byłaby uważana za klienta.

Oczywiście możesz pisać takie aplikacje i nie robić z nich usług. Nadal możesz je uruchamiać po uruchomieniu systemu Windows i uruchamiać w tle. Wiąże się to jednak z kilkoma wpisami rejestru i pewnymi zmianami w kodzie - korzystanie z interfejsu API jest znacznie łatwiejsze niż w przypadku .NET. Z drugiej strony Microsoft znacznie to ułatwił, tworząc usługi i umożliwiając nam zarejestrowanie ich w systemie operacyjnym. Jest znacznie prostszy i łatwiejszy do wdrożenia niż robienie tego ręcznie.


+1 - Aby wyjaśnić, usługa jest hostowana na serwerze jako usługa systemu Windows, a następnie pakiet SDK klienta wysyła informacje do serwera za pośrednictwem portu w celu przesłania danych w celu otrzymania informacji zwrotnej. Czy moje rozumowanie jest prawidłowe?
Karthik Sreenivasan

1
@Karthik, czy masz na myśli wzorzec projektowy czy mój przykład? Jeśli chodzi o to pierwsze, tak .. lub demona w Uniksie. Komunikacja byłaby jakąś formą TCP / IP. Jeśli odwołujesz się do mojego przykładu, serwer wideo jest demonem na wbudowanym komputerze z linuksem. SDK komunikuje się przez port, serwer wideo ma pętlę nasłuchiwania, której używa do przetwarzania żądań klienta.
Jonathan Henson

@ Karthik, nawiasem mówiąc, nie musi to być TCP / IP ani Pipe. Widziałem, jak ludzie używają sygnałów z gniazdami do komunikacji międzyprocesowej. Jednak wzór projektowy jest taki sam. Sposób komunikacji zależy od architekta projektu.
Jonathan Henson

Odniosłem się do przykładu.
Karthik Sreenivasan

2

Przykłady programów kandydujących:

  • Systemy, które muszą monitorować zasoby / inne aplikacje i wysyłać raporty (aktywność użytkownika, określone rodzaje ruchu do plików, powiadomienia o niewłaściwym działaniu aplikacji)

  • Systemy oferujące usługi dla innych aplikacji lokalnych (tłumaczenia, konwersja plików, przesyłanie wiadomości między systemami)

  • Oprogramowanie antywirusowe.

Myślę, że są to duże przykłady, których nie można łatwo wykonać przy użyciu zaplanowanych zadań.


+1 za przykłady. Czy mógłbyś omówić ruch w plikach?
Karthik Sreenivasan

1
Na przykład, jeśli masz aplikację internetową, która widzi sporadyczne skoki w przesyłaniu plików, chciałbyś zaalarmować kogoś o nich. Dotyczy to również każdego zasobu, który może zobaczyć wzrosty w dziwnych momentach (np. Ruch internetowy, użycie procesora), które mogą nie zostać wykryte przez zaplanowane kontrole (z powodu aliasingu).
linkerro

2

Moje ulubione przykłady korzystania z usług:

  1. Serwery - programy obsługujące żądania od zdalnych klientów. Zazwyczaj będą działać jako usługi, aby upewnić się, że są one dostępne bez względu na to, czy użytkownik jest zalogowany na serwerze, czy nie. Uruchomienie jako usługa oznacza również, że serwer rozpoczyna przetwarzanie żądań natychmiast po uruchomieniu komputera, nikt nie musi się logować na komputerze, aby uruchomić program po ponownym uruchomieniu komputera z jakiegokolwiek powodu. Serwer bazy danych jest doskonałym przykładem.
  2. Przetwarzanie w tle - programy odpowiedzialne za przetwarzanie danych ze źródła danych i przechowywanie wyników w celu danych. Cel danych jest często źródłem innego procesu i tak dalej. Uruchamianie jako usługi pozwala tym programom po prostu tam siedzieć i czekać na dane. Pozwala także programistom poprawić niezawodność przetwarzania, dzieląc proces na wiele pół-niezależnych kroków.

+1 dla serwera bazy danych. Wszystko się układa. Wszyscy używamy SqlConnection lub OledbConnection do łączenia się z bazą danych, która jest faktycznie przetwarzana przez usługę znajdującą się na serwerze.
Karthik Sreenivasan

2

Oto przykładowe użycie koncepcji usługi z prawdziwym kodem (patrz poniżej).

W ten sposób konfiguruje magistralę usług, która zużywa się z kolejki i nasłuchuje komunikatów z serwerów WWW i GUI klienta.

Po otrzymaniu wiadomości robi to, co jest logiczne dla domeny, zapisuje zdarzenia na dysku i publikuje je w brokerze wiadomości.

Większość większych aplikacji, które są luźno sprzężone, implementuje architekturę „roboczą”, taką jak poniżej.

Projekt Documently to przykładowy projekt, który stworzyliśmy dla osób takich jak Ty, aby uczyć się architektury rozproszonej. Możesz zadawać mi pytania bezpośrednio w projekcie lub rozwidlać je i zaimplementować jakąś funkcję uczenia się, a następnie przesłać żądanie ściągnięcia (i otrzymać komentarze do kodu).

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 za ilustrację przykładem. Spróbuję wdrożyć twój przykład, aby uzyskać lepsze zrozumienie.
Karthik Sreenivasan

2

Jakiś czas temu mój zespół zaimplementował 3 usługi Windows w banku tutaj w Brazylii, jak poniżej:

  • Interfejs między systemami: Mieliśmy aplikację front-office odpowiedzialną za księgowanie transakcji na giełdzie oraz aplikację back-office, odpowiedzialną za księgowanie i obliczanie opłat za transakcje. Początkowo komunikacja między systemami odbywała się bezpośrednio na serwerze SQL, ale zbyt wiele problemów z blokowaniem i przechowywaniem spowodowało obniżenie wydajności systemu. Wdrożono usługę łączenia się z przednimi i tylnymi bazami danych oraz prawidłowego odczytu / zapisu przy użyciu pewnego rodzaju strategii przechowywania (zamiast zapisywać każdą pojedynczą transakcję na SQL Server, przechowujemy dane w pewnym stopniu, powiedzmy 1000 transakcji i wykonał wkładkę zbiorczą, która była 40 razy szybsza niż oryginalne rozwiązanie i długo nie blokowała wielu zaangażowanych tabel).

  • Kolejka komunikatów: Wraz z poprzednim rozwiązaniem napisaliśmy niestandardową procedurę obsługi kolejki komunikatów, aby kilka procedur przetwarzania wsadowego mogło działać asynchronicznie. Zostało to zintegrowane zarówno z MSMQ, jak i IBM-MQSeries.

  • Centralizacja usług biznesowych: kilka aplikacji użytkowników potrzebowało na przykład wspólnych danych jako cen akcji, dlatego napisaliśmy niestandardową usługę odpowiedzialną za otrzymywanie „zapytań o cenę” i odesłanie informacji o cenie.

Jednym z aspektów, który doprowadził nas do napisania usług, zamiast „robotów”, jest to, że usługi mogą działać jako określony użytkownik (jak ktoś już wskazał w tym wątku) i mogą być inicjowane automatycznie po uruchomieniu komputera.

Usługi również nie potrzebują do działania pulpitu ani usługi zarządzania oknami. Mogą działać w tle (cóż, muszą działać w tle).

A jeśli jesteście jak moi rówieśnicy, którzy nie lubią pisać interfejsów użytkownika, usługi stanowią wielkie wyzwanie technologiczne, ponieważ zwykle nie mogą zawieść. Bardzo fajnie jest napisać usługę. :)


+1 przykład na żywo. Ze wszystkich dobrych odpowiedzi udzielonych przez wszystkich tutaj, teraz lepiej rozumiem właściwe korzystanie z usług Windows i myślę, że inni programiści na pewno skorzystają z dzielenia się wiedzą tutaj. Niektóre implementacje, nad którymi pracowałem w przeszłości, mogły zostać lepiej zaimplementowane przy użyciu usług Windows.
Karthik Sreenivasan

0

Jeśli projektujesz aplikację komputerową Windows, która musi działać jako zwykły użytkownik, ale czasami musi wykonać zadanie wymagające uprawnień administratora, możesz skorzystać z usługi.

Instalator instaluje usługę z niezbędnymi uprawnieniami, aplikacja komputerowa wywołuje usługę, gdy musi wykonać zadanie z uprawnieniami administratora.

Takie podejście ma wpływ na bezpieczeństwo, które wykracza poza zakres tej odpowiedzi.


Jeśli dobrze rozumiem, usługi Windows nie mogą być wywoływane bez zgody administratora?
Karthik Sreenivasan

2
Nie, usług Windows nie można zainstalować ani uruchomić bez uprawnień administratora. Ale każdy użytkownik może się z nimi komunikować, jeśli usługa nasłuchuje (pomyśl o gniazdach, nazwanych potokach itp.)
Eclipse

1
Z pewnością standardowy użytkownik może uruchomić i wywołać usługę Windows. Usługa musi zostać zainstalowana przez administratora.
Jim In Texas

0

Dla programistów głównym powodem korzystania z usługi jest:

  • Ten program musi uruchomić się automatycznie na komputerze z systemem Windows po ponownym uruchomieniu.

Wszystko, co napiszesz, musi być zgodne z powyższym, musi działać jako usługa systemu Windows.


0

Najbardziej użyteczna usługa, którą napisałem z perspektywy użytkownika końcowego:
* Faktury UGLY drukowane przez użytkownika na drukarce igłowej ze sterownikiem druku RAW.
* Użytkownik chciał mieć DOKŁADNĄ fakturę z logo, gładką grafiką.
* Brak dostępu do starszego kodu.

Usługa:
* Monitoruje (wiele) folderów drukarki dla zadań drukowania.
* Utwórz plik PDF faktury.
* PDF „podkłada” ładny pusty fakturę
* Nakłada nieprzetworzony tekst
* Wyszukaj metadane na podstawie używanego folderu (IE: używana drukarka)

Następnie metadane:
* Wygenerują PDF
* i / lub wydrukują PDF
* i / lub plik PDF do ostatecznego folderu docelowego
* i / lub usuń plik PDF
* i / lub wysłać fakturę PDF do klienta

W tym przypadku obsługuje on ghost-script, sterowniki PLC i silniki PDF. Od lat działa bardzo czysto. Dołącz pliki dziennika !!!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.