太阳当空照-Windows服务化方式sc.exe应用

2023-11-21 06:20

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

前言

日常开发工作中,对于已经包含基础功能的系统,需要为前端同事提供测试环境时,常常需要在搭建好测试环境后,保证测试环境的正常运行,如果程序本身是控制台程序,那控制台就需要保证一直开启,关闭控制台程序将影响到测试系统的正常运行,相比于Linux系的相关系统,例如CentosUbuntu,服务化便捷,同时支持也很多,例如SupervisorWindows系统中,就显得比较尴尬,服务化手段较少,而且集中化管理较弱,测试系统演进如下:

  • 人工通过控制台启动

    服务重新部署需要退出控制台,部署后重新打开控制台

  • .bat.cmd脚本启动

    双击脚本(管理员或普通用户),测试系统就启动了,单个系统,单个程序启动忍一忍就过了,辅助的系统和程序一多,维护成本也会逐渐增加

  • 系统服务化启动

    通过注册服务、启动服务、停止服务实现对系统启动细节的忽略,只关心系统的最终执行状态

    ggcy-blog-service-sc-header

sc.exe简述

sc.exe为服务控制管理service control manager,用于对计算机的系统服务进行管理,实现注册,运行,暂停,自启等基础操作,用户能够将符合Windows系统服务化条件的程序进行本地系统后台服务化运行,注册到服务注册表目录下的程序,通过sc的指令实现程序执行状态的切换和管理。

指令清单

指令具体细节内容可以查看官网或笔者的另一篇文章太阳当空照-Windows服务化方式sc.exe指令清单

常用指令

sc create

添加服务信息到注册表中

sc <server> create [service name] [binPath= ] <option1> <option2>...

例如

>sc create sctest binPath=\"E:\Study\Servers\sctest\sctest.exe\”"
sc description

设置服务的描述字符串

sc <server> description [service name] [description]
sc start

启动服务运行

sc <server> start [service name] <arg1> <arg2> ...
sc query

查询服务

sc query [service name] <arg1> <arg2> ...
sc stop

停止服务

sc stop [service name]
sc delete

删除服务注册表信息

sc delete [service name]

示例

服务案例

案例为笔者自己基于C#,在基于Core3.1创建的控制台程序,用于每隔一秒,项当前目录下的日志文件中换行写入小时:分钟:秒,由于是使用符合Windows服务化标准的相关依赖库,此处略过对类库Microsoft.Extensions.Hosting.WindowsServices的介绍和使用,项目源码可通过公众号进行领取,此处程序目前未为x86,也可以依据需求生成x64

打包生成的文件结构如下:

ggcy-service-sctest

创建服务

管理员权限运行cmd,执行创建指令,binPath=<空格>尾部添加对应sctest.exe的绝对路径,避免注册服务过程中,路径中的特殊字符无法被正常识别,可对路径外部添加双引号

sc create sctest binPath=\"E:\Study\Servers\sctest\sctest.exe\”"
[SC] CreateService 成功

查看任务管理器中的服务

ggcy-service-sc-create

打开服务,找到sctest服务,查看属性,会发现,binPath实际就是可执行文件的路径

ggcy-service-sc-server

或者执行query指令

>sc query sctestSERVICE_NAME: sctestTYPE               : 10  WIN32_OWN_PROCESSSTATE              : 1  STOPPEDWIN32_EXIT_CODE    : 1077  (0x435)SERVICE_EXIT_CODE  : 0  (0x0)CHECKPOINT         : 0x0WAIT_HINT          : 0x0

添加描述

创建服务时,如果为通过指令sc create [service name] binPath= 路径 displayname= "描述内容",进行描述设置,可以通过,sc description进行设置

>sc description sctest "this is sctestservice"
[SC] ChangeServiceConfig2 成功

打开服务查看sctest的描述内容如下:

ggcy-service-sc-description

启动服务

方式一

直接使用sc start [service name]进行服务启动,启动成功输出结果如下:

>sc start sctestSERVICE_NAME: sctestTYPE               : 10  WIN32_OWN_PROCESSSTATE              : 2  START_PENDING(NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)WIN32_EXIT_CODE    : 0  (0x0)SERVICE_EXIT_CODE  : 0  (0x0)CHECKPOINT         : 0x0WAIT_HINT          : 0x7d0PID                : 32296FLAGS              :
方式二

也可以使用net start [service name]进行服务启动

>net start sctest
sctest 服务正在启动 .
sctest 服务已经启动成功。

服务启动成功后,可以看到在sctest.exe同一级别目录下,生成一个[年-月-日].log文件,内容大体如下:

当前时间:Service Start
当前时间:00:29:50
当前时间:00:29:51
.........

停止服务

停止服务可以使用sc,也可以使用net,服务停止后,对应的[年-月-日].log文件内容,也将不再增加

方式一

使用sc stop,在使用sc query查看服务当前状态,或直接去到任务管理器,查看任务页签中服务sctest的状态

>sc stop sctestSERVICE_NAME: sctestTYPE               : 10  WIN32_OWN_PROCESSSTATE              : 3  STOP_PENDING(STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)WIN32_EXIT_CODE    : 0  (0x0)SERVICE_EXIT_CODE  : 0  (0x0)CHECKPOINT         : 0x0WAIT_HINT          : 0x0>sc query sctestSERVICE_NAME: sctestTYPE               : 10  WIN32_OWN_PROCESSSTATE              : 1  STOPPEDWIN32_EXIT_CODE    : 0  (0x0)SERVICE_EXIT_CODE  : 0  (0x0)CHECKPOINT         : 0x0WAIT_HINT          : 0x0
方式二

使用net stop进行服务停止

>net stop sctest
sctest 服务正在停止.
sctest 服务已成功停止。

删除服务

使用指令sc delete将对应服务进行删除

>sc delete sctest
[SC] DeleteService 成功

关闭任务管理器再次打开,其中将不再能够看到服务sctest,表明服务删除成功

常见问题

服务注册

binPath服务程序执行路径

注册服务时,binPath为必须项,需要指定路径,若是执行文件夹路径包含特殊字符时,需要为路径添加双引号如下:

sc create [service name] binPath= “服务程序绝对路径”

服务启动

启动失败,返回1503

服务注册成功后,启动服务时,服务等待一段时间后,返回程序无响应

[SC] StartService 失败 1053:服务没有及时响应启动或控制请求。

查看Windows自带的事件查看器,在Windows日志系统可以看到来源Service Control Manager的相关错误信息

ggcy-service-sc-log

日志内容如下:

ggcy-service-sc-logdetails

造成此类问题的情况很多,目前笔者摸索到的有以下几类:

  • 目标程序本身,在编码级别,并没有通过编码方式,实现程序自身的Windows服务化,简单来说就是,程序不支持sc方式启动

  • 程序必要的程序启动路径,配置文件加载路径,内部数据输出路径等错误,造成程序执行异常

    服务本身在启动时,默认为独立进程启动,实际上依据sc的管理启动,程序的工作目录并不是在当前服务exe所在目录,所以服务程序相关路径最好是以绝对路径方式配置,或者启动服务时参数传入,同时服务程序如果有对应的日志输出,也可以依据本地日志输出查看对应问题细节

服务删除

无法删除服务,提示服务已暂停

使用sc delete删除对应服务时,提示该服务已暂停,此时需要关闭services.msc,重新启动就可以发现,服务已经不存在

参考链接

【服务器角色命令】https://docs.microsoft.com/zh-cn/windows-server/administration/windows-commands/sc-config

【编写Windows服务】https://www.cnblogs.com/RainFate/p/12095793.html

获取上述内容中的服务测试源码项目,可关注私信或直接评论回复【sc.exe

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



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

相关文章

在Ubuntu上部署SpringBoot应用的操作步骤

《在Ubuntu上部署SpringBoot应用的操作步骤》随着云计算和容器化技术的普及,Linux服务器已成为部署Web应用程序的主流平台之一,Java作为一种跨平台的编程语言,具有广泛的应用场景,本... 目录一、部署准备二、安装 Java 环境1. 安装 JDK2. 验证 Java 安装三、安装 mys

Jsoncpp的安装与使用方式

《Jsoncpp的安装与使用方式》JsonCpp是一个用于解析和生成JSON数据的C++库,它支持解析JSON文件或字符串到C++对象,以及将C++对象序列化回JSON格式,安装JsonCpp可以通过... 目录安装jsoncppJsoncpp的使用Value类构造函数检测保存的数据类型提取数据对json数

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Linux磁盘分区、格式化和挂载方式

《Linux磁盘分区、格式化和挂载方式》本文详细介绍了Linux系统中磁盘分区、格式化和挂载的基本操作步骤和命令,包括MBR和GPT分区表的区别、fdisk和gdisk命令的使用、常见的文件系统格式以... 目录一、磁盘分区表分类二、fdisk命令创建分区1、交互式的命令2、分区主分区3、创建扩展分区,然后

Linux中chmod权限设置方式

《Linux中chmod权限设置方式》本文介绍了Linux系统中文件和目录权限的设置方法,包括chmod、chown和chgrp命令的使用,以及权限模式和符号模式的详细说明,通过这些命令,用户可以灵活... 目录设置基本权限命令:chmod1、权限介绍2、chmod命令常见用法和示例3、文件权限详解4、ch

Java中的密码加密方式

《Java中的密码加密方式》文章介绍了Java中使用MD5算法对密码进行加密的方法,以及如何通过加盐和多重加密来提高密码的安全性,MD5是一种不可逆的哈希算法,适合用于存储密码,因为其输出的摘要长度固... 目录Java的密码加密方式密码加密一般的应用方式是总结Java的密码加密方式密码加密【这里采用的

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(

Mycat搭建分库分表方式

《Mycat搭建分库分表方式》文章介绍了如何使用分库分表架构来解决单表数据量过大带来的性能和存储容量限制的问题,通过在一对主从复制节点上配置数据源,并使用分片算法将数据分配到不同的数据库表中,可以有效... 目录分库分表解决的问题分库分表架构添加数据验证结果 总结分库分表解决的问题单表数据量过大带来的性能

javafx 如何将项目打包为 Windows 的可执行文件exe

《javafx如何将项目打包为Windows的可执行文件exe》文章介绍了三种将JavaFX项目打包为.exe文件的方法:方法1使用jpackage(适用于JDK14及以上版本),方法2使用La... 目录方法 1:使用 jpackage(适用于 JDK 14 及更高版本)方法 2:使用 Launch4j(