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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 太阳当空照-Windows服务化方式sc.exe应用

前言

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

  • 人工通过控制台启动
    服务重新部署需要退出控制台,部署后重新打开控制台
  • .bat.cmd脚本启动
    双击脚本(管理员或普通用户),测试系统就启动了,单个系统,单个程序启动忍一忍就过了,辅助的系统和程序一多,维护成本也会逐渐增加
  • 系统服务化启动
    通过注册服务、启动服务、停止服务实现对系统启动细节的忽略,只关心系统的最终执行状态

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

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

创建服务

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

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

查看任务管理器中的服务

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

或者执行query指令

>sc query sctest
SERVICE_NAME: sctest
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 1  STOPPED
        WIN32_EXIT_CODE    : 1077  (0x435)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

添加描述

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

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

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

启动服务

方式一

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

>sc start sctest
SERVICE_NAME: sctest
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 2  START_PENDING
                                (NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x7d0
        PID                : 32296
        FLAGS              :

方式二

也可以使用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 sctest
SERVICE_NAME: sctest
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 3  STOP_PENDING
                                (STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0
>sc query sctest
SERVICE_NAME: sctest
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 1  STOPPED
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_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的相关错误信息

日志内容如下:

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

  • 目标程序本身,在编码级别,并没有通过编码方式,实现程序自身的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



相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
安全 前端开发 Windows
Windows Electron 应用更新的原理是什么?揭秘 NsisUpdater
本文介绍了 Electron 应用在 Windows 中的更新原理,重点分析了 `NsisUpdater` 类的实现。该类利用 NSIS 脚本,通过初始化、检查更新、下载更新、验证签名和安装更新等步骤,确保应用的更新过程安全可靠。核心功能包括差异下载、签名验证和管理员权限处理,确保更新高效且安全。
36 4
Windows Electron 应用更新的原理是什么?揭秘 NsisUpdater
|
2月前
|
XML 缓存 前端开发
Electron-builder 是如何打包 Windows 应用的?
本文首发于微信公众号“前端徐徐”,作者徐徐深入解析了 electron-builder 在 Windows 平台上的打包流程。文章详细介绍了 `winPackager.ts`、`AppxTarget.ts`、`MsiTarget.ts` 和 `NsisTarget.ts` 等核心文件,涵盖了目标创建、图标处理、代码签名、资源编辑、应用签名、性能优化等内容,并分别讲解了 AppX/MSIX、MSI 和 NSIS 安装程序的生成过程。通过这些内容,读者可以更好地理解和使用 electron-builder 进行 Windows 应用的打包和发布。
176 0
|
2月前
|
数据可视化 程序员 C#
C#中windows应用窗体程序的输入输出方法实例
C#中windows应用窗体程序的输入输出方法实例
54 0
|
4月前
|
Unix Linux Ruby
在windows和linux上高效快捷地发布Dash应用
在windows和linux上高效快捷地发布Dash应用
|
4月前
|
Linux iOS开发 开发者
跨平台开发不再难:.NET Core如何让你的应用在Windows、Linux、macOS上自如游走?
【8月更文挑战第28天】本文提供了一份详尽的.NET跨平台开发指南,涵盖.NET Core简介、环境配置、项目结构、代码编写、依赖管理、构建与测试、部署及容器化等多个方面,帮助开发者掌握关键技术与最佳实践,充分利用.NET Core实现高效、便捷的跨平台应用开发与部署。
359 3
|
4月前
|
PHP Windows
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误
|
4月前
|
vr&ar C# 图形学
WPF与AR/VR的激情碰撞:解锁Windows Presentation Foundation应用新维度,探索增强现实与虚拟现实技术在现代UI设计中的无限可能与实战应用详解
【8月更文挑战第31天】增强现实(AR)与虚拟现实(VR)技术正迅速改变生活和工作方式,在游戏、教育及工业等领域展现出广泛应用前景。本文探讨如何在Windows Presentation Foundation(WPF)环境中实现AR/VR功能,通过具体示例代码展示整合过程。尽管WPF本身不直接支持AR/VR,但借助第三方库如Unity、Vuforia或OpenVR,可实现沉浸式体验。例如,通过Unity和Vuforia在WPF中创建AR应用,或利用OpenVR在WPF中集成VR功能,从而提升用户体验并拓展应用功能边界。
85 0
|
4月前
|
存储 开发者 C#
WPF与邮件发送:教你如何在Windows Presentation Foundation应用中无缝集成电子邮件功能——从界面设计到代码实现,全面解析邮件发送的每一个细节密武器!
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中集成电子邮件发送功能,详细介绍了从创建WPF项目到设计用户界面的全过程,并通过具体示例代码展示了如何使用`System.Net.Mail`命名空间中的`SmtpClient`和`MailMessage`类来实现邮件发送逻辑。文章还强调了安全性和错误处理的重要性,提供了实用的异常捕获代码片段,旨在帮助WPF开发者更好地掌握邮件发送技术,提升应用程序的功能性与用户体验。
73 0
|
4月前
|
C# Windows 监控
WPF应用跨界成长秘籍:深度揭秘如何与Windows服务完美交互,扩展功能无界限!
【8月更文挑战第31天】WPF(Windows Presentation Foundation)是 .NET 框架下的图形界面技术,具有丰富的界面设计和灵活的客户端功能。在某些场景下,WPF 应用需与 Windows 服务交互以实现后台任务处理、系统监控等功能。本文探讨了两者交互的方法,并通过示例代码展示了如何扩展 WPF 应用的功能。首先介绍了 Windows 服务的基础知识,然后阐述了创建 Windows 服务、设计通信接口及 WPF 客户端调用服务的具体步骤。通过合理的交互设计,WPF 应用可获得更强的后台处理能力和系统级操作权限,提升应用的整体性能。
124 0
|
4月前
|
网络安全 API 数据安全/隐私保护
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Windows)
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Windows)