C# 写的windows服务进程守护实现

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());
            }
        }
        
posted @ 2021-01-20 20:11  清风笑  阅读(786)  评论(0)    收藏  举报