• 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());
                }
            }
            
    
  • 相关阅读:
    pdfobject (前台展示PDF插件)
    ERROR 19608 --- [ost-startStop-1] c.atomikos.persistence.imp.LogFileLock : ERROR: the specified log seems to be in use already: tmlog in D: ools omcatapache-tomcat-8.5.51in ransaction-logs
    文件上传下载(四) 读 txt 文本 ajaxfileupload
    1129
    centos服务器上部署项目(二) -tomcat
    Guns 打包
    centos服务器上部署项目(一) -jdk,mysql
    layui 学习笔记(四) 复杂表头前台Excel导出
    SpringCloud项目搭建(四) zuul
    sql的基本查询语句
  • 原文地址:https://www.cnblogs.com/KevinMO/p/14304788.html
Copyright © 2020-2023  润新知