[C#]通用守护进程服务

摘要

很多情况下,都会使用windows服务做一些任务,但总会有一些异常,导致服务停止。这个时候,开发人员又不能立马解决问题,所以做一个守护者服务还是很有必要的。当检测到服务停止了,重启一下服务,等开发人员到位了,再排查错误日志。

代码

app.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <appSettings>
    <!--要守护的服务的服务名称-->
    <add key="toWatchServiceName" value=""/>
    <!--守护服务的名称-->
    <add key="serviceName" value="邮件提醒服务守护服务"/>
    <!--每1分钟检查一次 以秒为单位-->
    <add key="timerInterval" value="60"/>
  </appSettings>
</configuration>

服务

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;

namespace WindowsService.Watch
{
    partial class ServiceWather : ServiceBase
    {
        private static string currentExePath = string.Empty;
        public ServiceWather()
        {
            InitializeComponent();
            currentExePath = AppDomain.CurrentDomain.BaseDirectory;
        }
        /// <summary>
        /// 检查间隔
        /// </summary>
        private static readonly int _timerInterval = Convert.ToInt32(ConfigurationManager.AppSettings["timerInterval"]) * 1000;
        /// <summary>
        /// 要守护的服务名
        /// </summary>
        private static readonly string toWatchServiceName = ConfigurationManager.AppSettings["toWatchServiceName"];
        private System.Timers.Timer _timer;
        protected override void OnStart(string[] args)
        {
            //服务启动时开启定时器
            _timer = new System.Timers.Timer();
            _timer.Interval = _timerInterval;
            _timer.Enabled = true;
            _timer.AutoReset = true;
            _timer.Elapsed += _timer_Elapsed;
            LogHelper.WriteLog(currentExePath, "守护服务开启");
        }

        void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            //如果服务状态为停止,则重新启动服务
            if (!CheckSericeStart(toWatchServiceName))
            {
                StartService(toWatchServiceName);
            }
        }

        protected override void OnStop()
        {
            if (_timer != null)
            {
                _timer.Stop();
                _timer.Dispose();
                LogHelper.WriteLog(currentExePath, "守护服务停止");
            }
        }
        /// <summary>
        /// 启动服务
        /// </summary>
        /// <param name="serviceName">要启动的服务名称</param>
        private void StartService(string serviceName)
        {
            try
            {
                ServiceController[] services = ServiceController.GetServices();
                foreach (ServiceController service in services)
                {
                    if (service.ServiceName.Trim() == serviceName.Trim())
                    {
                        service.Start();
                        //直到服务启动
                        service.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 30));
                        LogHelper.WriteLog(currentExePath, string.Format("启动服务:{0}", serviceName));
                    }
                }
            }
            catch (Exception ex)
            {
                LogHelper.WriteLog(currentExePath, ex);
            }
        }
        private bool CheckSericeStart(string serviceName)
        {
            bool result = true;
            try
            {
                ServiceController[] services = ServiceController.GetServices();
                foreach (ServiceController service in services)
                {
                    if (service.ServiceName.Trim() == serviceName.Trim())
                    {
                        if ((service.Status == ServiceControllerStatus.Stopped)
                            || (service.Status == ServiceControllerStatus.StopPending))
                        {
                            result = false;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                LogHelper.WriteLog(currentExePath, ex);
            }
            return result;
        }
        /// <summary>
        /// 停止
        /// </summary>
        /// <param name="serviceName"></param>
        private void StopService(string serviceName)
        {
            try
            {
                ServiceController[] services = ServiceController.GetServices();
                foreach (ServiceController service in services)
                {
                    if (service.ServiceName.Trim() == serviceName.Trim())
                    {
                        service.Stop();
                        //直到服务停止
                        service.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 30));
                        LogHelper.WriteLog(currentExePath, string.Format("启动服务:{0}", serviceName));
                    }
                }
            }
            catch (Exception ex)
            {
                LogHelper.WriteLog(currentExePath, ex);
            }
        }
    }
}
时间: 2024-10-06 00:20:23

[C#]通用守护进程服务的相关文章

用C#实现通用守护进程

1. 下载 源码下载:http://pan.baidu.com/s/1vqDA2 安装包下载:http://pan.baidu.com/s/1sjmEB0p 2. 安装注意事项 在配置档中配置你要守护的应用程序,应用程序之间用逗号隔开 <?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="ProcessAddr

rsync服务配置流程-守护进程

rsync服务配置流程rsync守护进程服务部署流程: #第一步:检查软件服务是否安装[[email protected] ~]# rpm -qa|grep rsyncrsync-3.0.6-12.el6.x86_64如果rsync软件不存在yum install -y rsync #第二步:编写rsync的配置文件/etc/rsyncd.conf*****rsyncd.conf是rsync服务默认配置文件,但是默认不存在vim /etc/rsyncd.conf#rsync_config #cr

asp.net core2.0 部署centos7/linux系统 --守护进程supervisor(二)

原文:asp.net core2.0 部署centos7/linux系统 --守护进程supervisor(二) 续上一篇文章:asp.net core2.0 部署centos7/linux系统 --安装部署(一),遗留的问题而来,对程序添加守护进程,使网站可以持续化的运行起来. ? 1.介绍supervisor ?? ?Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,

windows下通过bat脚本和计划任务实现设置某一服务的守护进程

通常服务器上跑的服务或者应用程序比较重要,如果无意间被关闭将造成不定程度的影响.通过为比较重要的服务设置守护进程,守护服务的进程.当服务关闭时可以自动开启,方法如下: 第一步:写守护进程的bat脚本  内容如下: 脚本内容中  set_task=RDO.exe意思为检查是否有RDO.exe进程. 要用的话就改成自己的进程名,如果进程宕了就过会自动重启(会在RDO.exe进程安装目录下生成一个start.bat) 其中 start.bat脚本内容中的start 后面的参数与set_svr后面的参数

写一个Windows上的守护进程(6)Windows服务

写一个Windows上的守护进程(6)Windows服务 守护进程因为要开机启动,还要高权限,所以我就把它做成Windows服务了. 关于Windows服务的官方文档,大家可以看https://msdn.microsoft.com/en-us/library/windows/desktop/ms686953(v=vs.85).aspx. 总的来说,服务的行为区别于普通应用程序的地方有以下几点: 1. 一般来说,服务是运行于System用户下的,当然也可以自己指定.也就是说服务可以在无用户登录的情

Android 通过JNI实现守护进程,使得Service服务不被杀死

来自: http://finalshares.com/read-7306 转载请注明出处: http://blog.csdn.net/yyh352091626/article/details/50542554 开发一个需要常住后台的App其实是一件非常头疼的事情,不仅要应对国内各大厂商的ROM,还需要应对各类的安全管家...虽然不断的研究各式各样的方法,但是效果并不好,比如任务管理器把App干掉,服务就起不来了... 网上搜寻一番后,主要的方法有以下几种方法,但都是治标不治本: 1.提高Serv

SSSD-系统安全服务守护进程

参考url:http://blog.sina.com.cn/s/blog_588c88cb0100ywoh.html SSSD是红帽企业版Linux6中新加入的一个守护进程,该进程可以用来访问多种验证服务器,如LDAP,Kerberos等,并提供授权.SSSD是 介于本地用户和数据存储之间的进程,本地客户端首先连接SSSD,再由SSSD联系外部资源提供者(一台远程服务器). 这样做有一些几点优势: 1.避免了本地每个客户端程序对认证服务器大量连接,所有本地程序仅联系SSSD,由SSSD连接认证服

linux shell脚本守护进程监控svn服务

最近搭建的svn服务不知道什么原因服务总是被关闭(如果你不知道怎么搭建svn可以参考linux下搭建svn版本控制软件),因此用shell脚本实现一个守护进程.用于监控svn服务是否启动,如果服务不在则启动. 创建监控脚本svnmonit.sh #! /bin/sh #进程名字可修改 PRO_NAME=svnserve PORT=58652 REP_DIR=/www/svndata while true ; do #用ps获取$PRO_NAME进程数量 NUM=`ps aux | grep ${

Linux 124课程 8、管理本地的Linux用户和组、控制服务和守护进程

1.系统启动和服务器进程的管理器RH5 6 首先启动Init 进程 system v RH7 使用 systemd 是系统启动和服务器进程的管理器 特点: 并行化功能: 十个进程并行启动 按需启动守护进程: 只启动你必须要的进程 自动服务依赖关系,可以防止长时间的超时: 控制组,实现进程的控制方式: Systemctl systemd单元 单元类型: 1. .service 服务单元2. .socket 套接字 3. .path 路径单元 4. ... systemctl list-units