2011-07-02 17 views
5

Projektuję usługę systemu Windows, która obsługuje listę procesów. Może uruchamiać na nich zadania. Na przykład - zatrzymaj konkretny proces (na liście), uruchom ponownie określony proces, uruchom nowy proces i dodaj go do listy, itp.Projektowanie monitora procesu Usługa systemu Windows

Ta usługa systemu Windows jest kontrolowana przez aplikację internetową za pośrednictwem usługi WCF - Usługa systemu Windows uruchamia usługę WCF, a aplikacja internetowa łączy się z tą usługą WCF. Metody eksportu usług WCF, takie jak Restart(int id) i Stop(int id).

Mam kilka pytań:

  • Gdy proces nieoczekiwanie zamyka (na przykład z powodu błędu wewnętrznego), usługa powinna zaktualizować wartość w jakiejś bazie danych. Teraz, aby to zrobić, mam tylko wątek, który co 30 sekund sprawdza, czy proces jest uruchomiony, czy nie.

    Czy to prawo to robić? Czy powinienem użyć zdarzenia Exit?

  • Gdy usługa zamyka, na dowolnym powodu wszystkich procesów, że utrzymuje zamyka też. Jaki jest właściwy sposób na zrobienie tego?

    Zastanawiałem się nad samą pętlą na liście i zabij wszystkie procesy, gdy wywoływana jest usługa OnClose(). Problem polega na tym, że zdarzenie OnClose() nie zawsze jest wywoływane. Na przykład, co jeśli usługa nieoczekiwanie się zamknie? Nie zadzwoni pod numer OnClose().

  • Jak powinienem reprezentować każde zadanie (na przykład - zrestartować proces lub zatrzymać proces)?

    W tej chwili używam System.Threading.Tasks. Czy to właściwa droga?

Usługa ta powinna być wysoce skalowalna, przy minimalnych błędach.

Dzięki.

+4

brzmi to tak, jakby ponownie wymyślić Menedżera kontroli usług systemu Windows? –

+1

Problem z SCM polega na tym, że nie można go rozszerzyć. W mojej usłudze mam również niestandardowe metody, nie tylko "restart" i "stop". –

+1

Następnie wystarczy napisać niestandardową aplikację. aby wysłać te wiadomości do hostowanego procesu SCM. Usługi Windows obsługują ten model. –

Odpowiedz

0

Aby zamknąć procesy po zamknięciu usługi, uważam, że wykonanie poniższych czynności może wykonać to zadanie.

  1. Napisz mały program, który może zamknąć procesy, które chcesz zamknąć.
  2. Przejdź do Service Control Manager i kliknij prawym przyciskiem myszy na swojej usłudze.
  3. Przejdź do zakładki Odzyskiwanie i określ program do wykonania w polach listy Pierwsza porażka, Druga awaria i Kolejna usterka.

Mam nadzieję, że to pomoże.

Powiązane problemy