C# 写的windows服务进程守护实现
最近在做一个windows服务实现windows socket server读取系统硬件,RFID的内容给WEB网站使用。在测试过程中,发现RFID读取过程有时会导致服务无端中止。因为涉及到硬件调用,查不到具体的原因。所以就简单的处理,做一个进程守护,当windows的服务进程退出之后,自动重新开启。以前使用的方法是,另外做一个程序监测。因为那种方法比较麻烦,现在介绍一种更简单的方法。使用cmd使用。
1. 首先建立复制一下内容。新建一个autostart.bat的脚本文件。
@echo off
rem 定义循环间隔时间和监测的服务:
set secs=60
set srvname="服务名称"
echo.
echo ========================================
echo == 查询计算机服务的状态, ==
echo == 每间隔%secs%秒种进行一次查询, ==
echo == 如发现其停止,则立即启动。 ==
echo ========================================
echo.
echo 此脚本监测的服务是:%srvname%
echo.
if %srvname%. == . goto end
:chkit
set svrst=0
for /F "tokens=1* delims= " %%a in ('net start') do if /I "%%a %%b" == %srvname% set svrst=1
if %svrst% == 0 net start %srvname%
set svrst=
rem 下面的命令用于延时,否则可能会导致cpu单个核心满载。
ping -n %secs% 127.0.0.1 > nul
goto chkit
:end
双击该批处理文件,运行界面如下
========================================
== 查询计算机服务的状态, ==
== 每间隔%secs%秒种进行一次查询, ==
== 如发现其停止,则立即启动。 ==
========================================
此脚本监测的服务是:%srvname%
如果%srvname%停止后,该批处理检测到后会重启该服务,界面如下
========================================
== 查询计算机服务的状态, ==
== 每间隔%secs%秒种进行一次查询, ==
== 如发现其停止,则立即启动。 ==
========================================
此脚本监测的服务是:%srvname%
%srvname% 服务正在启动
%srvname% 服务已经启动成功。
按实际情况修改
set srvname="服务名称"
这里的服务名称。
把文件保存到服务的安装文件夹。
2. C#相关代码
/// <summary>
/// 启动服务
/// </summary>
/// <param name="args"></param>
protected override void OnStart(string[] args)
{
StartTimer();
}
System.Timers.Timer timer = new System.Timers.Timer();
/// <summary>
/// 启动定时器
/// </summary>
private void StartTimer()
{
timer.Interval = 1000;
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
timer.Start();
}
///执行的
void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (!PortInUse(13001))
{
//LogOuts.Debug("open:"+1);
//启动socket
StartWS();
}
else
{
//LogOuts.Debug("open:" + 2);
}
//如果没执行命令,执行cmd监听。
if (!execdCmd)
{
execdCmd = true;
execCmd();
}
}
private bool execdCmd = false;
private void execCmd()
{
Process proc = null;
try
{
proc = new Process();
proc.StartInfo.FileName = AppDomain.CurrentDomain.BaseDirectory+ @"\autostart.bat";
proc.StartInfo.Arguments = string.Format("");//this is argument
proc.StartInfo.CreateNoWindow = false;
proc.Start();
proc.WaitForExit();
}
catch (Exception ex)
{
Console.WriteLine("Exception Occurred :{0},{1}", ex.Message, ex.StackTrace.ToString());
}
}