太阳当空照-Windows服务化方式NSSM应用

2023-11-21 06:20

本文主要是介绍太阳当空照-Windows服务化方式NSSM应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

之前章节介绍了,sc.exeinstsrvsrvanyWinsw进行在Windows系统中的应用程序服务化操作,本章讲解Windows系统中,服务化的另一个利器Nssm

ggcy-blog-service-sc-header

文章目录

    • 前言
    • 工具介绍
      • 源码地址
      • 程序下载
    • 基础指令
      • 常用指令
        • 安装
        • 启动
        • 修改
        • 查看配置
        • 查看状态
        • 停止
        • 卸载
    • 案例实践
        • 安装服务
          • 服务列表
          • 服务查询
        • 启动服务
        • 停止服务
        • 卸载服务

工具介绍

Nssm全称为the Non-Sucking Service Manager,翻译为不是很糟糕的服务管理工具,参考链接:https://nssm.cc/

nssm is a service helper which doesn’t suck. srvany and other service helper programs suck because they don’t handle failure of the application running as a service. If you use such a program you may see a service listed as started when in fact the application has died. nssm monitors the running service and will restart it if it dies. With nssm you know that if a service says it’s running, it really is. Alternatively, if your application is well-behaved you can configure nssm to absolve all responsibility for restarting it and let Windows take care of recovery actions.

nssm logs its progress to the system Event Log so you can get some idea of why an application isn’t behaving as it should.

nssm also features a graphical service installation and removal facility. Prior to version 2.19 it did suck. Now it’s quite a bit better.

Google翻译:

nssm是一个不错的服务助手。 srvany 和其他服务帮助程序很糟糕,因为它们不处理作为服务运行的应用程序的故障。 如果您使用这样的程序,您可能会看到一个服务被列为已启动,而实际上该应用程序已经死亡。 nssm监视正在运行的服务,如果它死了,它将重新启动它。 使用 nssm,您知道如果服务说它正在运行,它确实是。 或者,如果您的应用程序表现良好,您可以配置 nssm以免除重新启动它的所有责任,并让 Windows 负责恢复操作

实际上,Nssm这些描述还停留在n年前,虽然srvany在高版本Windows系统中,已经不再升级,但并不妨碍,工具包的安装和使用,Winsw也能够输出异常日志,就目前来说,nssm从操作便捷度上看,还是优于目前笔者已知的其他工具

源码地址

git://git.nssm.cc/nssm/nssm.git or http://git.nssm.cc/nssm/nssm.git

程序下载

https://nssm.cc/release/nssm-2.24.zip

解压后,服务分为两个版本,一个是32位,一个是64位,依据需求进行选择

blog-jrz-nssm-dir

基础指令

常用指令

安装

服务名称(Path),启动路径(Startup directory)和服务名(Service name)属于必填项,其他配置,要么可以选择默认

nssm install <servicename>

blog-jrz-nssm-cmd01

启动

根据服务名称启动服务

nssm start <servicename>
修改

用于设置对应服务的特定配置

nssm set <servicename> <parameter>
查看配置

根据服务名称获取对应的配置值

nssm set <servicename> <parameter>
查看状态
nssm status <servicename>
停止

停止服务运行

nssm stop <servicename>
卸载

卸载服务

nssm remove <servicename>

blog-jrz-nssm-cmd02

卸载成功

blog-jrz-nssm-cmd03

更多指令配置请查看笔者的文章太阳当空照-Windows服务化方式NSSM指令清单

案例实践

案例,为基于.Net Core的一个简单控制台程序,功能和之前笔者文章中,进行服务化的控制台程序一致,原来的配方,项目名换成nssmtest,内容如下:

static void Main(string[] args)
{while (true){string datestr = DateTime.Now.ToString("HH:mm:ss");//休眠一秒,输出一秒日期时间字符串特定文本文件Thread.Sleep(1000);LogMsg(datestr);}
}private static void LogMsg(string msg)
{//System.AppDomain.CurrentDomain.BaseDirectory//获取程序集目录:C:\Windows\Temp\.net\sctest//System.Environment.CurrentDirectory//获取该进程从中启动的目录:C:\Windows\system32//System.IO.Directory.GetCurrentDirectory()//获取当前应用工作路径:C:\Windows\system32//获取当前进程所属的执行exe文件名称string filename = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;string dictoryPath = Path.GetDirectoryName(filename);string path = System.IO.Path.Combine(dictoryPath, $"{DateTime.Now.ToString("yyyy-MM-dd")}.log");using (var writer = File.AppendText(path)){writer.WriteLine($"当前时间:{msg}");}
}

发布后目录如下:

blog-jrz-nssm-casedir

以管理员权限执行cmd,切换路径到nssm程序集目录下,此处为E:\DownLoads\nssm-2.24\win64

安装服务
>nssm install
Service "nssmtest" installed successfully!

选择对应exe发布路径

blog-jrz-nssm-caseinstall

确认无误后,点击按钮[Install service],提示安装成功

blog-jrz-nssm-caseinsuccess

查看服务列表或者执行服务查询指令,可查看到对应服务是否存在,进行二次核查确认

服务列表

blog-jrz-nssm-caseservice

服务查询
>nssm status nssmtest
SERVICE_STOPPED

>sc query nssmtest 
SERVICE_NAME: nssmtestTYPE               : 10  WIN32_OWN_PROCESSSTATE              : 1  STOPPEDWIN32_EXIT_CODE    : 1077  (0x435)SERVICE_EXIT_CODE  : 0  (0x0)CHECKPOINT         : 0x0WAIT_HINT          : 0x0
启动服务
>nssm start nssmtest
nssmtest: START: 操作成功完成。

查看状态

>nssm status nssmtest
SERVICE_RUNNING

blog-jrz-nssm-caserun

执行程序目录下生成对应时间输出文件

blog-jrz-nssm-runresult

停止服务
>nssm stop nssmtest
nssmtest: STOP: 操作成功完成。
>nssm status nssmtest
SERVICE_STOPPED

blog-jrz-nssm-casestop

卸载服务
>nssm remove nssmtest
Service "nssmtest" removed successfully!

blog-jrz-nssm-caseremove

卸载成功

blog-jrz-nssm-removesuccess

>nssm status nssmtest
Can't open service!
OpenService(): 指定的服务未安装。

以上即为笔者对于在Windows上实现应用程序服务化,使用nssm的基本操作,如需要上述测试程序,评论或者私信笔者

这篇关于太阳当空照-Windows服务化方式NSSM应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/400423

相关文章

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

Spring创建Bean的八种主要方式详解

《Spring创建Bean的八种主要方式详解》Spring(尤其是SpringBoot)提供了多种方式来让容器创建和管理Bean,@Component、@Configuration+@Bean、@En... 目录引言一、Spring 创建 Bean 的 8 种主要方式1. @Component 及其衍生注解

PostgreSQL简介及实战应用

《PostgreSQL简介及实战应用》PostgreSQL是一种功能强大的开源关系型数据库管理系统,以其稳定性、高性能、扩展性和复杂查询能力在众多项目中得到广泛应用,本文将从基础概念讲起,逐步深入到高... 目录前言1. PostgreSQL基础1.1 PostgreSQL简介1.2 基础语法1.3 数据库

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

Linux系统管理与进程任务管理方式

《Linux系统管理与进程任务管理方式》本文系统讲解Linux管理核心技能,涵盖引导流程、服务控制(Systemd与GRUB2)、进程管理(前台/后台运行、工具使用)、计划任务(at/cron)及常用... 目录引言一、linux系统引导过程与服务控制1.1 系统引导的五个关键阶段1.2 GRUB2的进化优

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

Python中yield的用法和实际应用示例

《Python中yield的用法和实际应用示例》在Python中,yield关键字主要用于生成器函数(generatorfunctions)中,其目的是使函数能够像迭代器一样工作,即可以被遍历,但不会... 目录python中yield的用法详解一、引言二、yield的基本用法1、yield与生成器2、yi