Windows下的通用进程守护程序(持续更新中),高仿supervisor。

news2025/1/13 17:34:31
  • 📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!
  • 📢本文作者:由webmote 原创
  • 📢作者格言:无尽的折腾后,终于又回到了起点,工控,我来了 !

Window下的通用守护进程

在这里插入图片描述

是的,有这个需求。

曾经,我也觉得没必要,然而,现实很残酷。

比如开发了.net core的web程序,明明可以很好的部署在IIS下,但领导偏不,他就想启动为不可见的Console程序。如果是一个console程序,那么还可以借助exe转service的技术,把它转换成windows service服务,好像也没啥大不了,怕就怕竟然又多个。

多个console启动在服务端虽然有些不好看,忍忍是不是就没事了? 不,如果程序写的不好崩溃了咋办?这…容我思考下,感觉好像需要写个守护程序…

哎,部署在Linux下不行吗?使用supervisor不行吗?好像也可以,好像又不行。

好吧,那就准备操练一把,写个通用的守护进程程序吧。

守护配置

目标,守护多个进程。
士兵,windows 服务。
军粮:守护配置。

用户可以灵活配置守护,如同Supervisor配置一样。配置内容如下:

[program:WebTest]
# 项目根目录
directory=C:\Users\source\repos\Framework\WebTest\WebTest\bin\Debug\net6.0
# 启动执行命令
command=C:\Users\source\repos\Framework\WebTest\WebTest\bin\Debug\net6.0\WebTest.exe
stderr_logfile=d:\test_stderr.log
stdout_logfile=d:\test_stdout.log
arguments=
env=

有了这个配置,你就可以轻松配置被守护的程序,执行目录,参数以及环境变量了。当然也可以重定向输出日志和错误日志。

下载

当前版本实现了基本的守护功能,程序自动启动为 guard service服务,自我测试,运行良好。
下载文件在 此

使用了dotnet的一体化打包模式,不需要安装.net6运行环境。因此包稍微大了点。

dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true /p:PublishTrimmed=true

具体实现逻辑

首先选用了TopShelf类库包,这样就减轻了开发windows service的复杂度和安装命令解析的复杂度。
因此,exe执行文件可以带一系列参数进行服务的安装和卸载工作。

 service install
        Installs the service into the service control manager

    service install -username:joe -password:bob --autostart
        Installs the service using the specified username/password and
        configures the service to start automatically at machine startup

    service uninstall
        Uninstalls the service

    service install -instance:001
        Installs the service, appending the instance name to the service name
        so that the service can be installed multiple times. You may need to
        tweak the log4net.config to make this play nicely with the log files.

我写了个直接运行的批处理文件,解包后可以看到是RunAsService.bat,内容如下:

call WbtGuardService.exe install --autostart 
echo start guard service...
call WbtGuardService.exe start

预留了开关web服务的配置(包含端口号),可以修改appsettings.json文件的配置

{
  "Kestrel": {
    "Endpoints": {
      "Http": {"Url": "http://*:8088"}     
    }
  },
  "EnableWeb": "true", 
  "UserName": "admin",
  "Password": "admin",
  "CheckInterval": 20000,
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*"
}

内部核心的代码,无非是包装了process的调用方法。代码如下:

private Process StartProcess()
        {
            _logger.Info($"开始程序 {this.config.Name}...");
            var bDir = !string.IsNullOrEmpty(this.config.Directory);
            Process p = Process.GetProcessesByName(config.Name)?.FirstOrDefault();
            if (p == null)
            {
                var startInfo =  new ProcessStartInfo
                {
                    FileName = this.config.Command,
                    UseShellExecute = false,
                    RedirectStandardOutput = stdoutStream != null,
                    RedirectStandardError = stderrorStream != null,
                    WorkingDirectory = bDir ? this.config.Directory : AppDomain.CurrentDomain.BaseDirectory,
                    Arguments = this.config.Arguments,
                    CreateNoWindow = true,                   
                    //StandardOutputEncoding = Encoding.UTF8,
                    //StandardErrorEncoding = Encoding.UTF8,
                };
                foreach (var (key, value) in this.config.GetEnvironmentVariables())
                {
                    if (value is not null)
                    {
                        startInfo.Environment[key] = value;
                    }
                    else
                    {
                        // Null value means we should remove the variable
                        // https://github.com/Tyrrrz/CliWrap/issues/109
                        // https://github.com/dotnet/runtime/issues/34446
                        startInfo.Environment.Remove(key);
                    }
                }
                Console.WriteLine($"start {config.Name}  ....");
                p = new Process
                {
                    StartInfo =startInfo,
                };
                
                p.ErrorDataReceived += P_ErrorDataReceived;
                p.OutputDataReceived += P_OutputDataReceived;

                try
                {
                    if (!p.Start())
                    {
                       
                    }

                    if (stdoutStream != null) p.BeginOutputReadLine();
                    if (stderrorStream != null) p.BeginErrorReadLine();
                    _logger.Info($"程序 {this.config.Name} 启动成功.");
                }
                catch (Win32Exception ex)
                {
                    
                }
            }

            return p;
        }

欢迎评论

如果你想用,有场景用,欢迎评论,如果评论超过十个,那么我就放在github上开源。

看看这个场景是真需求,还是假需求。

反正我不信真的有人用…

好吧,有产生了一个轮子。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/110209.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Three.js入门】标准网格材质、置换贴图、粗糙度贴图、金属贴图、法线贴图

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,也会涉及到服务端 📃个人状态: 在校大学生一枚,已拿多个前端 offer(秋招) 🚀未…

【实时数仓】DWS层的定位、DWS层之访客主题计算(PV、UV、跳出次数、计入页面数、连续访问时长)

文章目录一 DWS层与DWM层的设计1 设计思路2 需求梳理3 DWS层定位二 DWS层-访客主题计算1 需求分析与思路2 功能实现(1)封装VisitorStatsApp,读取Kafka各个流数据a 代码b 测试(2)合并数据流a 封装主题宽表实体类Visitor…

CMakeList

目录 .1 简介 .2 常用命令 2.1 指定 cmake 的最小版本 2.2 设置项目名称 2.3 设置编译类型 2.4 指定编译包含的源文件 2.4.1 明确指定包含哪些源文件 2.4.2 搜索所有的 cpp 文件 2.4.3自定义搜索规则 2.5 查找指定的库文件 2.6. 设置包含的目录 2.7. 设置链接库搜索…

中国晶振市场规模将增长至2026年的263.21亿元,国产市场未来可期

晶振作为频率控制和频率选择基础元件,广泛应用于资讯设备、移动终端、通信及网络设备、汽车电子、智能电表、电子银行口令卡等领域,随着新兴电子产业、物联网的快速发展,及以 5G、蓝牙 5.0、Wi-Fi 6 等无线通信新技术的广泛应用,预…

基于Python的Flask WEB框架实现后台权限管理系统(含数据库),内容包含:用户管理、角色管理、资源管理和机构管理

#基于Flask实现后台权限管理系统 重磅!!!!!!!!!!! 全新的风格界面,完全的前后端分离。基于ElementUI,前端代码基于RuoYi…

plotly parallel_coordinates平行坐标可视化

使用plotly画平行坐标图,代码如下: 其中数据使用excel的csv格式(当然可以使用其它格式),csv的标头是参数名。 import plotly.express as px import numpy as np import pandas as pd# df px.data.iris() df pd.read…

【爬虫】JS逆向解决反爬问题系列3—sign破解

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据开发、数据分析等。 🐴欢迎小伙伴们点赞👍🏻、收藏⭐️、…

DOM(一):获取页面元素、操作元素

DOM&#xff08;一&#xff09;获取页面元素事件操作元素获取页面元素 1.根据ID获取 使用getElementById()方法获取带有ID的元素对象,格式如下&#xff1a; var 变量名 document.getElementById(‘id名’); 例如&#xff1a; <div id time>2022-12-18</div> &…

PyTorch——应用一个已训练好的图片分类网络——AlexNet

1.识别一个图像主体的预训练网络 ImageNet数据集是由一个Stanford大学维护的包含1400多万幅图像的非常大的数据集&#xff0c;所有的图像都用来自WordNet数据集的名词层次结构标记&#xff0c;而WordNet数据集又是一个大型的英语词汇数据库。 1.1获取一个预先训练好的网络用于…

【矩阵论】7.范数理论——基本概念——矩阵范数生成向量范数谱范不等式

7.1.3 矩阵范数产生向量范数 CnnC^{n\times n}Cnn 上任一矩阵范数 ∥∙∥\Vert \bullet\Vert∥∙∥ 都产生一个向量范数 φ(X)∥X∥V\varphi(X)\Vert X\Vert_Vφ(X)∥X∥V​ 矩阵范数与向量范数的相容性&#xff1a;φ(Ax)≤∥A∥φ(x)\varphi(Ax)\le \Vert A\Vert\varphi(x)φ…

蓝牙耳机什么牌子好?音质好、配置高的蓝牙耳机分享

​经常听到很多网友在讨论哪些蓝牙耳机好用&#xff0c;什么蓝牙耳机的配置高......选购蓝牙耳机无非就是音质、蓝牙技术、续航、佩戴体验等各方面条件&#xff0c;还有哪位朋友不知道该如何选购蓝牙耳机的&#xff1f;根据我对蓝牙耳机的了解&#xff0c;从网上整理了好几款蓝…

【关于eps8266自动重启 Soft WDT reset】

【关于eps8266自动重启 Soft WDT reset】1. 前言2. 分析问题2.1 长时间没有喂狗2.2 delayMicroseconds 函数触发3. 解决问题3.1 解决长时间没有喂狗3.2 解决delayMicroseconds 函数触发5. 小结1. 前言 最近使用esp8266进行远程遥控时, 但是在驱动舵机servo库的过程中出现了esp…

第二证券|两大板块掀涨停潮,有个股猛拉20cm!这只港股复牌一度暴跌

A股商场周五上午窄幅震动&#xff0c;上证指数微涨0.09点&#xff0c;核算机等板块领涨。 新股体现持续分解&#xff0c;4只今日上市的新股中&#xff0c;两只科创板新股上涨&#xff0c;两只北交所新股则破发。 港股全体小幅调整&#xff0c;全体动摇不算大&#xff0c;但仍…

【推荐】智慧农业解决方案资料合集30篇

智慧农业 是农业中的智慧经济&#xff0c;智慧经济形态在农业中的具体表现。智慧农业是智慧经济重要的组成部分&#xff1b;对于发展中国家而言&#xff0c;智慧农业是智慧经济主要的组成部分&#xff0c;是发展中国家消除贫困、实现后发优势、经济发展后来居上、实现赶超战略的…

16含风光水的虚拟电厂与配电公司协调调度模型(场景削减MATLAB程序)

参考文献 含风光水的虚拟电厂与配电公司协调调度模型——董文略&#xff08;复现场景削减部分&#xff09; 主要内容 代码主要做的是风电、光伏以及电价场景不确定性模拟&#xff0c;首先由一组确定性的方案&#xff0c;生成50种光伏场景&#xff0c;为了避免大规模光伏场景…

小结 | 支持向量机 (SVM)

一.基本原理 SVM是一种二分类模型 基本思想&#xff1a;在特征空间中寻找间隔最大的分离超平面使数据得到高效的二分类&#xff0c;具体来讲&#xff0c;有三种情况&#xff08;不加核函数的话就是线性模型&#xff0c;加了之后才会升级为一个非线性模型&#xff09; 当训练…

MybatisPlus详解 | DQLDML快速开发... | 系统性学习 | 无知的我费曼笔记

无知的我正在复盘MybatisPlus&#xff0c;顺便上传笔记。。。 下图是我总结的 MP 知识的初级思维导图&#xff0c;后续会不断补充 文章目录1 MyBatisPlus入门案例与简介1.1 入门案例回顾SpringBoot整合Mybatis的开发过程:步骤1:创建数据库及表步骤2:创建SpringBoot工程步骤…

二苯并环辛炔-聚乙二醇-生物素DBCO-PEG-Biotin简介 DBCO-PEG-Biotin衍生物可以在没有金属催化剂(铜离子)作用下发生点击化学反应

中文名&#xff1a;二苯并环辛炔-聚乙二醇-生物素&#xff0c;生物素-聚乙二醇环辛炔 英文名&#xff1a;DBCO-PEG-Biotin&#xff0c;Biotin-PEG-DBCO 溶剂&#xff1a;溶于大部分有机溶剂&#xff0c;如&#xff1a;DCM、DMF、DMSO、THF等等&#xff0c;在水中有很好的溶解性…

变分自编码器VAE的数学原理

变分自编码器(VAE)是一种应用广泛的无监督学习方法&#xff0c;它的应用包括图像生成、表示学习和降维等。虽然在网络架构上经常与Auto-Encoder联系在一起&#xff0c;但VAE的理论基础和数学公式是截然不同的。本文将讨论是什么让VAE如此不同&#xff0c;并解释VAE如何连接“变…

【JVS低代码】一分钟学会如何快速创建应用

应用中心功能介绍 在JVS角色中有“应用管理员”的角色&#xff0c;如果赋予该角色&#xff0c;则用户为应用管理员&#xff0c;应用管理员有进入应用配置中心的权限。 创建空白应用&#xff1a; 从模板创建应用&#xff1a; 应用中心入口 具备应用管理员权限的用户&#xff…