2011-12-21 13 views
3

特定のサービスが実行されているかどうかを確認したいと思います(表示名 - ServiceAがあるとします)。私のプログラムは、サービスがまだ実行中であることを5分ごとにチェックするようにしたい。それがうまくいけば、ループしてさらに5分待ってからもう一度チェックしてください。 ServiceAが停止していることがわかったら、私にメールで私に電子メールを送り、ServiceAの実行を停止してほしい。私は今まで実行しているすべての現在のサービスと実際の表示名をコンソールに戻すことができるコードを以下に示します。私が上に必要なもののために必要なコード/ロジックに関するアイデアは誰でも?Windowsサービスが停止したら私にメールしてください

namespace ServicesChecker 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ServiceController[] scServices; 
      scServices = ServiceController.GetServices(); 

      Console.WriteLine("Services running on the local computer:"); 
      foreach (ServiceController scTemp in scServices) 
      { 
       if (scTemp.Status == ServiceControllerStatus.Running) 
       { 
        Console.WriteLine(); 
        Console.WriteLine(" Service :  {0}", scTemp.ServiceName); 
        Console.WriteLine(" Display name: {0}", scTemp.DisplayName); 
       } 
      } 
      //Create a Pause.... 
      Console.ReadLine(); 
     } 
    } 
} 
+0

チェッカーが実行を停止するとどうなりますか...! –

+2

Windowsはすでにこれを行うことができます。サービスが停止または失敗したときにアクションをトリガーするだけのアプリケーションを作成する必要はありません。 –

+0

@Cody:HoesはWindowsでそうしていますか? – abatishchev

答えて

4

は、アレイ内のすべてのサービスの名前を入れて、あなたの希望の名前が

List<string> arr = new List<string>();  
foreach (ServiceController scTemp in scServices) 
{ 
    if (scTemp.Status == ServiceControllerStatus.Running) 
    { 
     arr.add(scTemp.ServiceName); 
    } 
} 
if (arr.Contains("YourWantedName") 
{ 
    // loop again 
} 
else 
{ 
    // send mail 
} 
+0

c#:http://social.msdn.microsoftからメールを送信するスニペット。com/Forums/en/netfxnetcom/thread/a75533eb-131b-4ff3-a3b2-b6df87c25cc8単純なメッセージを送信するために必要なものがすべて含まれているはずです。 –

+1

2011年末に 'ArrayList'のような非ジェネリックコンテナを使用することをお勧めしません!代わりに 'List 'のようなgenericを使用してください。 – abatishchev

+0

@abatishchev - 私のサービスの名前の配列をチェックし続けることができるので、ループのロジックのロジックは何ですか? –

0

を実行している場合は、ストレージのいくつかの並べ替えを必要とするサービスの状態を追跡する必要があります確認してください。最も簡単なこの

<services> 
<service name="service1" last-check="12/21/2011 13:00:05" last-status="running" /> 
... 
</services> 

のような多分スキーマ、おそらくあなたの監視アプリサービスのステータスを追跡するXMLファイルで、それが興味を持っているサービスのステータスを見つける目を覚ますと、何を参照するためにチェックしますそのサービスの以前のステータスはです。ステータスが実行中であっても現在停止している場合は、電子メールを送信します。サービスが見つからない場合は、サービスのリストに追加します。

サービスのステータスをディスクに保存すると、監視アプリケーションが停止した場合に保護されます。

0

Heres全く同じようなことをするサービスの例。あなたのことができinstantiate ServiceController with the service name:あなたが探しているどちらわかっている場合、すべてのサービスを反復処理する必要は、ありません

public partial class CrowdCodeService : ServiceBase 
    { 
     private Timer stateTimer; 
     private TimerCallback timerDelegate; 
     AutoResetEvent autoEvent = new AutoResetEvent(false); 

     public CrowdCodeService() 
     { 
      InitializeComponent(); 
     } 
     int secondsDefault = 30; 
     int secondsIncrementError = 30; 
     int secondesMaximum = 600; 
     int seconds; 
     protected override void OnStart(string[] args) 
     { 
      Loggy.Add("Starting CrowdCodeService."); 
      timerDelegate = new TimerCallback(DoSomething); 
      seconds = secondsDefault; 
      stateTimer = new Timer(timerDelegate, autoEvent, 0, seconds * 1000); 
     } 

     static bool isRunning = false; 

     // The state object is necessary for a TimerCallback. 
     public void DoSomething(object stateObject) 
     { 
      if (CrowdCodeService.isRunning) 
      { 
       return; 
      } 
      CrowdCodeService.isRunning = true; 
      AutoResetEvent autoEvent = (AutoResetEvent)stateObject; 
      try 
      { 

       ////// Do your work here 


       string cs = "Application"; 
       EventLog elog = new EventLog(); 
       if (!EventLog.SourceExists(cs)) 
        { 
         EventLog.CreateEventSource(cs, cs); 
        } 
        elog.Source = cs; 
        elog.EnableRaisingEvents = true; 

        elog.WriteEntry("CrowdCodes Service Error:" + cmd.Message.ToString(), EventLogEntryType.Error, 991); 
       } 
      } 
      finally 
      {  
       CrowdCodeService.isRunning = false; 
      } 

     } 


     protected override void OnStop() 
     { 
      Loggy.Add("Stopped CrowdCodeService."); 
      stateTimer.Dispose(); 
     } 
    } 
2

...あなたのニーズに適合させるのは簡単でなければなりません。

メールを送信する方法:System.Net.Mail.MailMessageクラスをご覧ください。

NB:サービスが失敗した場合にトリガーするようにサービスを設定することもできます。

+0

で検索すると、サービスがトリガーされてアクションがトリガーされます。停止すると電子メールを送信するようトリガーできますか?これについてどうやって行くのですか? –

+0

電子メールを送信するコマンドラインツールを検索(または書き込み)し、彼のコメントにコディーグレイの説明に記載されている手順に従って設定します。 – Arnout

関連する問題