通用型Windows系统服务注册及管理软件的开发与实现

2021-12-22 06:29中国电建集团华东勘测设计研究院有限公司黄成家李增焕杨磊
数字技术与应用 2021年11期
关键词:配置文件命令应用程序

中国电建集团华东勘测设计研究院有限公司 黄成家 李增焕 杨磊

根据Windows服务器中的网站系统运维和开发工作需求,开发并实现了Windows系统下方便适用且非常轻量的系统服务注册及管理软件,克服了常规应用程序无法注册为合规的Windows系统服务的限制,可将任意的应用程序注册为系统服务,由此简化了Windows服务器中的网站或其他服务的开发、部署及更新工作。

0 引言

为应对服务器非正常重启等异常状况,网站服务、API服务或其他类似应用程序需要随系统开机自动运行。Linux系统下,采用service或systemd命令可以非常简便地将任意的应用程序注册为系统服务,实现应用程序随系统开机自动运行[1]。然而,Windows系统下却缺少类似的工具或软件,给Windows服务器的运维和管理人员带来了不便。

本文作者利用.Net Framework开发并实现了方便适用且非常轻量的系统服务注册及管理软件,引入中间二进制程序,克服了常规应用程序无法注册为合规的系统服务的限制,可将任意应用程序注册为系统服务,由此简化了Windows服务器下的网站或其他服务的开发、部署及更新工作。

1 现有解决方案的局限性

Windows系统下,将应用程序设置为随开机自动启动的现有方案主要有以下5种方法:

(1)修改注册表中的启动项;(2)将应用程序的快捷方式复制到启动目录下;(3)创建随开机启动的计划任务;(4)用sc命令将应用程序注册为系统服务;(5)用第三方工具(NSSM或类似工具)将应用程序注册为系统服务。

其中前两种方式均需用户登陆成功后才能运行,需要人工的介入,不适合系统重启后需要自动运行的应用程序(如网站服务或数据库服务等)。

创建计划任务可实现应用程序随开机自动启动,但是创建过程较为繁琐,且应用程序需要更新时也不方便。

采用系统自带的sc命令可实现系统服务的注册和启动,但是应用程序必须是可执行的二进制程序,且必须按照微软的服务程序格式编写,在程序内部实现一个特定的消息响应循环,否则,用sc命令注册为系统服务后,服务无法正常启动[2-5]。事实上,绝大多数常规应用程序都无法用sc命令注册为合规的系统服务。

采用NSSM或类似第三方工具将常规应用程序注册为系统服务是目前来说较为可行的解决方案,但是也存在命令行操作方式复杂、缺少日志管理功能、无退出通知机制等缺点。

2 运维工作需求及软件功能设计

系统运维工作中,网站服务、API服务或其他长期运行的服务类应用程序都有以下共性的需求:

(1)程序需要在后台长期运行,即便用户注销仍不停止。(2)系统开机或重启后,程序被自动启动。(3)程序意外停止时,程序被自动重新启动。(4)程序可能依赖于其他服务,启动之前需要先等待相关服务启动完成。(5)程序应能随时被用户停止或重启,以方便对服务进行更新。

根据以上需求,结合Windows系统服务提供的功能,并考虑操作简便的要求,整理本软件需要提供的命令及功能如下:

2.1 配置

用户将应用程序的命令行参数、工作目录、程序输出目录、输出编码,以及需注册的系统服务名称、服务依赖等信息保存在配置文件中。

2.2 安装服务(install命令)

注册并启动一个自启动的系统服务,服务名称等信息由配置文件指定,该服务启动时会去启动配置文件中指定的应用程序。同时,该服务会在系统开机时等待相关依赖启动后自动启动。

2.3 删除服务(remove命令)

停止并删除由配置文件中指定的系统服务,该服务停止时会通知并等待应用程序退出。

2.4 操作服务(stop|start|restart命令)

停止、启动或重启指定的系统服务。

当停止服务,应具有通知应用进程退出、并等待其自行退出的功能。

2.5 日志输出

应用程序运行过程的中输出(写入到标准输出或标准错误的数据)均按日期写入到配置文件中指定的目录下。

2.6 应用进程的监视

系统服务的运行过程中,对应用程序进程进行监视,如果发现该进程已退出或占用内存超过指定值,则重新启动应用程序。

3 软件开发及关键技术

3.1 开发语言及环境

软件采用C#语言编写,基于.NetFramework 4.0框架[6-7],开发环境采用Visual Studio Community 2019。

3.2 系统服务注册方式及软件运行模式

由于常规的应用程序无法注册为系统服务,因此,软件本身采用微软要求的服务程序格式要求编制,在程序内部实现服务消息循环。在调用软件的install命令时,该命令会将软件自身的二进制可执行文件注册为系统服务。而软件作为系统服务被启动时,会启动一个子进程去运行配置文件中指定的应用程序;该软件作为系统服务被停止时,会通知子进程退出并在必要的情况下直接终止子进程。按此方式,便绕过了常规应用程序无法注册为系统服务的限制,实现了任意应用程序随开机自动启动、并按系统服务模式随时停止或重启。

根据上述方式,软件有服务管理模式和服务运行模式两种运行模式。其中服务管理模式下,软件执行install|remove|stop|start|restart等命令,读取配置文件中指定的服务信息,调用sc create命令将自身的二进制可执行文件注册为系统服务,或调用sc delete命令删除已注册的系统服务,同时利用.Net Framework提供的ServiceController类对已注册的系统服务进行停止或启动等操作。而在服务运行模式下,软件的作为系统服务的执行程序,被Windows系统的服务管理器控制,响应系统传来的启动或停止等控制消息,并启动、监视或停止应用程序的运行。

3.3 软件运行流程

软件内部运行流程分别见图1、图2和图3。

图1 软件总体运行流程Fig.1 The overall running procedure of the software

图2 服务运行模式内部运行流程Fig.2 The running procedure of service-runner mode

图3 服务管理模式内部运行流程Fig.3 The running procedure of service-manager mode

3.4 配置文件定位策略

在服务管理模式下,软件由用户在命令行终端运行,因此配置文件直接使用当前工作目录下的特定文件(svc.conf)。

而在服务运行模式下,情况比较复杂,因为软件由Windows 系统的服务管理器启动,当前工作目录为系统目录,不是用户存放配置文件的目录。因此,本软件采用了以下策略来定位配置文件:

(1)注册服务时(此时在服务管理模式下),将配置文件路径保存在系统服务的Discription中。(2)服务运行模式下,首先根据本进程ID查找到本服务的ServiceName,再根据Service-Name获取本服务的Discription,由此便可得到配置文件路径。

4 应用实例

以下以一个简单的Node.js程序为例,说明本软件的使用方法。

4.1 示例应用程序

示例应用程序采用Node.js编写,其功能仅仅是每隔1秒打印一行信息,且键入回车后退出,程序代码如下:

4.2 软件安装

将软件自带文件拷贝到任意位置,右键单击bin目录下的register-this-path.bat,以管理员身份运行,将bin目录加入至系统路径中,也可以手动将此目录加入至系统路径。

重新打开“我的电脑”,在任意位置打开一个命令行窗口,输入svc-v,如果正常输出版本信息,则表明安装成功。

4.3 创建工程,修改配置

打开命令行窗口,输入svc create hello-svc,将创建一个工程hello-svc。将示例程序index.js拷贝到hellosvc/worker目录下。打开hello-svc/svc.conf文件,输入以下内容:

4.4 检查配置、测试应用程序

用管理员身份打开命令行窗口(Win10系统下,需要在开始菜单中搜索cmd然后右键以管理员身份运行),cd到hello-svc目录:

(1)运行svc check命令检查配置是否合法。(2)运行svc test-worker命令测试应用程序是否能正常运行。

4.5 服务注册及管理

若配置和应用程序无误,则:

(3)运行svc install命令安装并启动系统服务,此时应用程序就已经开始在后台运行了;

(4)运行svc log查看正在运行的服务程序的输出;

(5)运行svc stop|start|restart|remove停止、启动、重启或删除本系统服务。

4.6 确认软件效果

在系统重启、用户注销等情况下,用ssh远程连接系统,cd到hello-svc目录,运行svc log查看程序输出,确认应用程序一直在运行。

5 多服务注册及管理

按以上步骤,用svc create创建多个目录,修改svc.conf中的服务名和程序名等内容,再在这些目录下打开命令行窗口执行svc check|test-worker|install等命令可以注册多个服务,这些服务可使用以下命令进行统一管理:

(1)svc list|ls:列出所有服务的信息及运行状态。(2)svc start|stop|remove all:启动、停止或删除所有服务。(3)svc check|status|test-worker|install|start|stop|restart|remove|log $project-directory:操作$project-directory目录下svc.conf指定的服务,$project-directory中必须含有字符或/。(4)svc start|stop|restart|remove |log $service-name:操作名称为$service-name的服务。(5)svc start|stop|restart|remove|log $service-index:操作第$service-index个服务(运行svc ls可查看所有服务的序号)。

6 结语

从应用实例可以看出,本文实现的软件可将任意的应用程序注册为系统服务,克服了常规应用程序无法注册为合规的Windows系统服务的限制,与传统的计划任务或第三方工具方案相比,网站或其他服务的开发、部署及更新工作大为简化,为运维工作人员带来了很大的便利。软件自2019年11月发布在开源社区Github上以来,已被多个网站引用,并广受同行的好评。

猜你喜欢
配置文件命令应用程序
只听主人的命令
互不干涉混用Chromium Edge
删除Win10中自带的应用程序
谷歌禁止加密货币应用程序
忘记ESXi主机root密码怎么办
移防命令下达后
打印机设置
这是人民的命令
三星电子将开设应用程序下载商店
微软软件商店开始接受应用程序