如果windows服务停止,给我发邮件
本文关键字:windows 服务 如果 | 更新日期: 2023-09-27 18:18:33
我希望能够检查某个服务是否正在运行(假设它有一个显示名称- ServiceA)。我希望我的程序每5分钟检查一次服务是否还在运行。如果没有问题,它将循环并等待另外5分钟,然后再次检查。如果它发现ServiceA已经停止,我希望程序给我发邮件说……ServiceA已停止运行。下面是我到目前为止所做的代码,它能够将所有正在运行的当前服务和实际显示名称拉回控制台。有人对我上面需要的代码/逻辑有任何想法吗?
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();
}
}
}
将每个服务的名称放入数组中,并检查您想要的名称是否正在运行
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
}
如果您知道要查找哪个服务,则无需遍历所有服务:您可以使用服务名称实例化ServiceController
。
关于发送电子邮件:看一下System.Net.Mail.MailMessage类。
注意:你知道,你也可以配置服务,在失败时触发一个动作。
您将需要跟踪服务的状态,这将需要某种存储。最简单的可能是跟踪服务状态的XML文件,可能是像这样的模式
<services>
<service name="service1" last-check="12/21/2011 13:00:05" last-status="running" />
...
</services>
你的监控应用程序,将唤醒找到它感兴趣的服务的状态,并检查该服务的先前状态是什么。如果状态为运行,但目前已停止,请发送电子邮件。如果没有找到该服务,将其添加到服务列表中。
将服务状态保存到磁盘可以在监控应用程序出现故障时保护您。
这里有一个服务的例子,它做了类似的事情。应该很简单,以适应您的需求…
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();
}
}