# WatchDog **Repository Path**: ldming/watch-dog ## Basic Information - **Project Name**: WatchDog - **Description**: C#/.NET基于WinForm/Windows服务的看门狗程序。 - **Primary Language**: C# - **License**: BSD-3-Clause - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 30 - **Forks**: 20 - **Created**: 2021-09-25 - **Last Updated**: 2026-01-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README **README.md 优化版** --- # 无界面服务化进程守护系统 ## 项目背景 公司内部存在大量老旧的服务器程序,这些程序并非基于Windows服务构建,而是依赖于WinForm或控制台窗口运行。以往,我们依赖一个基于WinForm开发的第三方看门狗程序来管理这些应用,但该程序在服务器重启且用户未登录时无法自动启动,导致管理不便。 为了解决这一问题,我们决定开发一个无界面的Windows服务版进程守护系统,该系统能够在Windows服务环境中启动并监控目标EXE程序,即便在用户未登录桌面的情况下也能实现自启动和进程守护。 **注意**:由于Windows Vista及以后版本的服务程序运行在SESSION 0,而桌面程序运行在SESSION 1-X,直接通过Windows服务启动带窗口的EXE程序将无法显示UI界面。因此,本方案适用于无界面程序的守护,或需要将原有界面功能迁移至日志记录或Web页面的场景。 ## 项目构成 本项目分为两个主要部分: 1. **第三方看门狗程序功能复现与升级**:将原有的基于WinForm的看门狗程序重构,并升级.Net Framework至.Net 5.0,实现独立发布,不依赖目标机器的.Net Framework环境(但不再支持Windows 2003系统)。 2. **Windows服务版进程守护系统**:作为技术探索与实践,记录开发过程中遇到的问题与解决方案。 ## 项目架构与功能概述 ### 项目概述 本项目专为Windows服务器环境设计,采用无界面服务化架构,通过部署轻量级Windows服务程序实现核心监控功能。主要解决直接命令行启动或未注册为服务的EXE程序(如绿色软件Nginx、自定义脚本等)的进程守护问题。系统采用双模块架构,确保系统启动后立即工作,无需用户登录桌面即可自动监控目标进程。 ### 核心实现机制 1. **服务化监控架构**: - 部署独立Windows Service作为守护进程(运行于Session 0),通过SCM(服务控制管理器)注册实现系统级自启动。 - 采用进程树监控技术,精确追踪目标EXE的PID及其子进程。 2. **多场景兼容设计**: - 支持命令行程序守护(如通过`cmd /c start`启动的进程)。 - 为非服务程序提供虚拟服务化能力。 - 通过RPC机制实现跨Session管理,服务进程与用户会话进程间通信。 3. **智能恢复策略**: - 配置式心跳检测(支持TCP端口、文件锁、进程存活检查)。 - 三级故障响应机制:首次异常记录、二次异常重启、持续异常告警。 - 资源占用阈值保护,防止无限重启导致系统崩溃。 ### 典型应用场景 - 工业控制软件(如需双击启动的OPC Server)。 - 开发测试环境(直接命令行运行的微服务节点)。 - 遗留系统改造(未提供服务安装包的旧版应用)。 - 临时部署场景(快速搭建的Nginx/Redis等中间件)。 ### 技术优势 - **零桌面依赖**:完全脱离用户会话运行,支持无GUI服务器环境。 - **隐形守护**:无弹出窗口/托盘图标,避免干扰用户操作。 - **轻量高效**:内存占用<5MB,CPU占用<0.1%(空闲状态)。 - **合规安全**:符合Windows服务安全模型,支持域账户权限配置。 ### 核心功能 1. **进程监控与管理**:实时监控指定程序状态,自动重启崩溃或停止的进程。 2. **Windows服务模式**:以系统服务形式运行,确保用户未登录时也能正常工作。 3. **自动重启机制**:支持定时重启和异常重启。 4. **延时启动**:配置程序启动延迟时间。 5. **GUI界面管理**:提供桌面客户端进行配置和状态监控。 6. **SQLite持久化**:使用SQLite数据库存储监控配置。 7. **日志记录**:集成Serilog进行详细日志记录。 ### 系统架构 #### 双模块架构设计 1. **WatchDogApp(桌面客户端)**: - 基于WPF开发的图形界面。 - 提供监控项配置、状态查看、服务控制等功能。 - 通过托盘图标提供快速访问。 2. **WatchDog.WinService(Windows服务)**: - 核心监控引擎。 - 在后台持续监控指定程序。 - 处理进程重启和异常恢复。 ### 核心模块分析 #### 1. 监控项管理 - 使用SQLite数据库持久化存储监控配置。 - 支持增删改查操作,提供缓存机制提高查询效率。 - 通过事件通知机制同步配置变更。 #### 2. 进程管理 - 检测指定程序是否运行。 - 启动和停止进程。 - 计算进程运行时长。 #### 3. 数据模型示例 ```csharp public class WatchItem { public int Id { get; set; } public string FileName { get; set; } public string DisplayName { get; set; } public string FilePath { get; set; } public bool AutoStart { get; set; } // 自动启动 public int DelayStart { get; set; } // 延时启动时间(秒) public int ScheduledRestart { get; set; } // 定时重启(分钟) public string Remark { get; set; } public DateTime LastUpdateTime { get; set; } public string ConcurrencyStamp { get; set; } // 并发控制标记 } ``` #### 4. 服务通信机制 - 通过自定义命令实现客户端与服务端通信。 - 支持动态刷新配置、调整日志级别等功能。 ### 技术栈 - **.NET 10.0**:采用最新.NET框架。 - **WPF + HandyControl**:构建现代化UI界面。 - **Entity Framework Core + SQLite**:实现数据持久化。 - **Serilog**:进行详细的日志记录。 - **Topshelf风格的服务架构**:封装Windows服务。 ### 关键特性 1. **会话隔离处理**:专门处理Windows服务Session 0隔离问题。 2. **热配置更新**:配置更改后能即时通知服务更新。 3. **延时任务调度**:支持复杂的延时启动逻辑。 4. **系统级权限**:以LocalSystem账户运行,具备高权限。 5. **独立发布**:支持单文件发布,无需目标机器安装.NET Framework。 --- ## 参考文档 - [C#/.NET基于Topshelf创建Windows服务的守护程序作为服务启动的客户端桌面程序不显示UI界面的问题分析和解决方案](https://www.cnblogs.com/bobositlife/p/10918354.html) - [C#穿透session隔离———Windows服务启动UI交互程序](https://www.cnblogs.com/CityOfThousandFires/p/10375242.html) - [在Windows服务中启动Asp.Net Core时 wwwroot目录为空](https://www.cnblogs.com/lwqlun/p/12153935.html) - [ASP.NET Core hosted in a Windows Service - static files not being served (i.e. contents of /wwwroot)](https://stackoverflow.com/questions/60561605/asp-net-core-hosted-in-a-windows-service-static-files-not-being-served-i-e-c)