C# 守护进程的介绍及实现详解

目录
  • 1、为什么需要守护进程
  • 2、守护进程有哪几种方式
  • 3、监听系统事件 和 WMI查询事件代码实现
    • 1) 系统事件监听进程的关闭
    • 2)WMI监听进程的启动和关闭

1、为什么需要守护进程

一般是为了保护我们的程序/服务的正常运行,当程序被关闭、异常退出等时再次启动程序/恢复服务

2、守护进程有哪几种方式

常见的守护进程的方式:
1、轮询(轮询最简单也最low,这里不再作说明)
2、监听系统事件
3、WMI查询事件

3、监听系统事件 和 WMI查询事件代码实现

1) 系统事件监听进程的关闭

需要引入 System.Diagnostics namespace
原理便是通过订阅 Exited 事件
优点:代码简洁,逻辑清晰
缺点:无法监听进程的启动,且只能监听进程的正常退出,异常导致程序崩溃监听不到。

代码实现:

using System.Diagnostics;

var p = Process.GetProcessesByName("notepad")[0];
p.EnableRaisingEvents = true;
p.Exited += P_Exited;

Console.ReadLine();

void P_Exited(object? sender, EventArgs e)
{
    p = Process.Start("notepad");

    p.EnableRaisingEvents = true;
    p.Exited += P_Exited;
}

2)WMI监听进程的启动和关闭

WMI简介
Windows Management Instrumentation(WMI)是用于管理基于 Windows 操作系统的数据和操作的基础结构。

WMIC
是WMI的命令行管理工具。
使用 WMIC,不但可以管理本地计算机,而且还可以管理同一Windows域内的所有远程计算机(需要必要的权限),而被管理的远程计算机不必是先安装WMIC,只需要支持WMI即可。WMIC有一个能搞分析、解释和执行从命令行接受的别名(Alias)的引擎,他是一个可执行文件,名为 WMIC.exe,这个文件通常位于 “C:\Windows\System32\wbem” 文件夹中(支持Windows XP和Windows2003及以后的系统)

命令行例子:wmic cpu get name 查看CPU信息

有需要深入研究的小伙伴可以去看看:WMI编程手册

代码实现:

说明:System.Management namespace
.net framework版本中默认存在,直接引入即可
.net core中需要NuGet安装 “System.Management” 包

using System.Management;

// 查询进程创建 1秒钟通知
var qCreate = new WqlEventQuery($"__InstanceCreationEvent", TimeSpan.FromSeconds(1), $"TargetInstance isa \"Win32_Process\" and TargetInstance.Name = 'Notepad.exe'");

// 查询进程关闭 1秒钟通知
var qDelete = new WqlEventQuery($"__InstanceDeletionEvent", TimeSpan.FromSeconds(1), $"TargetInstance isa \"Win32_Process\" and TargetInstance.Name = 'Notepad.exe'");

// 创建事件查询的监听器
ManagementEventWatcher wCreate = new ManagementEventWatcher(qCreate);
ManagementEventWatcher wDelete = new ManagementEventWatcher(qDelete);

// 注册事件
wCreate.EventArrived += (sender, e) =>
{
    Console.WriteLine($"进程启动:{GetInfo(e.NewEvent)}");
};

wDelete.EventArrived += (sender, e) =>
{
    Console.WriteLine($"进程关闭:{GetInfo(e.NewEvent)}");
};

// 开始监听
wCreate.Start();
wDelete.Start();
Console.ReadLine();

static string GetInfo(ManagementBaseObject obj)
{
    var instance = obj["TargetInstance"] as ManagementBaseObject;
    return $"{instance["Name"]}-{instance["ProcessId"]}";
}

为了简明思路代码中并没有是现在进程退出后重新启动,有需要可以使用前面的 Process.Start("notepad"); 实现重启

到此这篇关于C# 守护进程的介绍及实现详解的文章就介绍到这了,更多相关C# 守护进程内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 利用C#编写Linux守护进程实例代码

    前言 Linux守护进程是Linux的后台服务进程,相当于Windows服务,对于为Linux开发服务程序的朋友来说,Linux守护进程相关技术是必不可少的,因为这个技术不仅仅是为了开发守护进程,还可以拓展到多进程,父子进程文件描述符共享,父子进程通讯.控制等方面,是实现Linux大型服务的基础技术之一. 如果要在Red Hat Enterprise Linux上将.NET Core进程作为后台进程运行,则可以创建自定义systemd单元.今天我将为.NET Core编写两个自定义系统单元的例子

  • 如何利用c#实现通用守护进程

    1. 下载 源码下载:http://files.cnblogs.com/tianzhiliang/CocoWatcher.rar 安装包下载:http://files.cnblogs.com/tianzhiliang/CocoWatcher_Setup.rar 本地下载:http://xiazai.jb51.net/201910/yuanma/CocoWatcher(jb51net).rar 2. 安装注意事项 在配置档中配置你要守护的应用程序,应用程序之间用逗号隔开: <?xml versio

  • C# 守护进程的介绍及实现详解

    目录 1.为什么需要守护进程 2.守护进程有哪几种方式 3.监听系统事件 和 WMI查询事件代码实现 1) 系统事件监听进程的关闭 2)WMI监听进程的启动和关闭 1.为什么需要守护进程 一般是为了保护我们的程序/服务的正常运行,当程序被关闭.异常退出等时再次启动程序/恢复服务 2.守护进程有哪几种方式 常见的守护进程的方式:1.轮询(轮询最简单也最low,这里不再作说明)2.监听系统事件3.WMI查询事件 3.监听系统事件 和 WMI查询事件代码实现 1) 系统事件监听进程的关闭 需要引入 S

  • php脚本守护进程原理与实现方法详解

    本文实例讲述了php脚本守护进程原理与实现方法.分享给大家供大家参考,具体如下: 思路: 1. while 循环,若当前没有数据要操作可以休眠: 2. crontab 脚本每隔固定时间段执行该脚本,执行时先检测是否已在执行,若无 执行,有则 跳过. 3. nohup  后台执行 4. flock -xn  加锁 实例: 要执行代码:index.php <?php set_time_limit(0); //死循环 while(1) { $message = '1111111' . "\n&q

  • Python Process创建进程的2种方法详解

    前面介绍了使用 os.fork() 函数实现多进程编程,该方法最明显的缺陷就是不适用于 Windows 系统.本节将介绍一种支持 Python 在 Windows 平台上创建新进程的方法. Python multiprocessing 模块提供了 Process 类,该类可用来在 Windows 平台上创建新进程.和使用 Thread 类创建多线程方法类似,使用 Process 类创建多进程也有以下 2 种方式: 直接创建 Process 类的实例对象,由此就可以创建一个新的进程: 通过继承 P

  • Java进程内缓存框架EhCache详解

    目录 一:目录 二: 简介 2.1.基本介绍 2.2.主要的特性 2.3. 集成 2.4. ehcache 和 redis 比较 三:事例 3.1.在pom.xml中引入依赖 3.2.在src/main/resources/创建一个配置文件 ehcache.xml 3.3.测试类 3.4.缓存配置 一:xml配置方式: 二:编程方式配置 3.5.Ehcache API 四:Spring整合 4.1.pom.xml 引入spring和ehcache 4.2.在src/main/resources添

  • Python语法学习之进程的创建与常用方法详解

    目录 进程的创建模块 - multiprocessing 创建进程函数 - Process 进程的常用方法 start 函数 join 函数 kill 函数 与 is_alive 函数 进程的相关问题 该章节我们来学习一下在 Python 中去创建并使用多进程的方法,通过学习该章节,我们将可以通过创建多个进程来帮助我们提高脚本执行的效率.可以认为缩短脚本执行的时间,就是提高执行我们脚本的效率.接下来让我们都看一下今天的章节知识点都有哪些? 进程的创建模块 - multiprocessing 创建

  • 对python 多线程中的守护线程与join的用法详解

    多线程:在同一个时间做多件事 守护线程:如果在程序中将子线程设置为守护线程,则该子线程会在主线程结束时自动退出,设置方式为thread.setDaemon(True),要在thread.start()之前设置,默认是false的,也就是主线程结束时,子线程依然在执行. thread.join():在子线程完成运行之前,该子线程的父线程(一般就是主线程)将一直存在,也就是被阻塞 实例: #!/usr/bin/python # encoding: utf-8 import threading fro

  • Maven build 命令介绍的使用详解

    常用命令: 打包:mvn package 编译:mvn compile 清空:mvn clean(清除编译后目录,默认是target目录) 运行测试:mvn test 安装jar包到本地仓库中:mvn install 跳过测试:mvn xxx -DskipTests 1.创建 Maven 工程 ①.在 src/main/java 新建包 com.ys.maven,然后在这个包中创建类 HelloMaven.java package com.ys.maven; public class Hello

  • Python JWT 介绍和使用详解

    1. JWT 介绍 ​jwt( JSON Web Tokens ),是一种开发的行业标准 RFC 7519 ,用于安全的表示双方之间的声明.目前,jwt广泛应用在系统的用户认证方面,特别是现在前后端分离项目 ​jwt认证流程: ​在项目开发中,一般会按照上图所示的过程进行认证,即:用户登录成功之后,服务端给用户浏览器返回一个 token,以后用户浏览器要携带 token 再去向服务端发送请求,服务端校验 token 的合法性,合法则给用户看数据,否则,返回一些错误信息 ​传统token方式和jw

  • React Fragment介绍与使用详解

    目录 前言 Fragments出现动机 React Fragment介绍与使用 <React.Fragment> 与 <>区别 前言 在向 DOM 树批量添加元素时,一个好的实践是创建一个document.createDocumentFragment,先将元素批量添加到 DocumentFragment 上,再把 DocumentFragment 添加到 DOM 树,减少了 DOM操作次数的同时也不会创建一个新元素. 和 DocumentFragment 类似,React 也存在

  • TKMybatis的介绍和使用详解

    目录 一.什么是 TKMybatis 二.TKMybatis 使用 2.1 Springboot 项目中加入依赖 2.2 使用讲解 2.3 实际案例 三.扩展介绍 泛型(实体类)的类型必须符合要求 所有的mapper继承此类将具有以下通用方法 一.什么是 TKMybatis TKMybatis 是基于 Mybatis 框架开发的一个工具,内部实现了对单表的基本数据操作,只需要简单继承 TKMybatis 提供的接口,就能够实现无需编写任何 sql 即能完成单表操作. 二.TKMybatis 使用

随机推荐