堪称神器,能将普通应用程序注册成 Windows 服务的助手程序 NSSM !

最近碰上一个闹心事儿,用户电脑的某些注册表项老是自动变化,导致一些功能无法正常工作。

于是我做了个简单的程序,定时监视并修正注册表项。

不过这程序跑的有点心酸。


写在注册表的 Run 启动项中,但容易被删除。

写在任务计划中,程序进程同样容易被咔嚓。

最后能想到的,只能是将程序变成服务在后台跑了。


关于 Windows 服务不得不说的秘密

我们想要说明白 Windows 服务的一些特殊性,那就必须将它拿来与普通应用程序相比较,这样我们立刻就理解了。

首先,Windows 服务是在系统后台悄悄地运行的,从表面上你是看不到它的,它也没有界面。

其次,Windows 服务是以 SYSTEM 或其他系统用户运行的,普通用户不能直接关闭程序。

最后,Windows 服务必须注册到系统中才能正常使用,并且服务的启动、停止等操作都必须有专门的消息接口来操控,说白了就是服务有自己的一套操作规范。


有的小伙伴会问,那我随便拿一个程序过来,然后将它注册成服务不就可以了嘛!

在这里我想强调的是最后一点,实际上没那么简单,并不是随便一个应用程序就可以将它作为服务运行的。

即使你注册成功,这个程序也未必启动得起来。


Windows 有自带的 sc 命令,虽然绿色环保,操作起来也不是特别麻烦,但是被注册的应用程序必须要符合系统服务规范才行,这个门槛就有点高了,我这够不着。

还有 instsrv+srvany 这对黄金搭档,也还能用,不过就是不能守护进程,容易挂进程。

不过现在我们遇到了一个很牛叉的程序,它号称可以将任何程序当作服务来跑,它就是 nssm

那么这个 nssm 是不是在吹牛呢?

是业界奇迹,还是弥天大谎,接下来我们就一同见证!


服务助手界的扛把子 NSSM

除了号称可将任意应用程序作为服务运行之外,nssm 还怒怼了其他同行,比如 srvany 等。

说有时服务看起来跑得欢,实际早已是死翘翘,但助手程序却浑然不觉,等等诸如此类问题,反正这也不行那也不行,总之诟病无数。

反观 nssm 就没有这些个毛病,并且做得还更好,当程序挂了,它会自动重启服务,表现良好。

同时还有进度记录到系统事件日志,还提供图形服务等等。


虽然 nssm 的最终稳定版 2.24 停留在 2014 年,但是它还是支持 Windows 10Windows Server 2016 甚至是更新的 Windows 版本的,因此大可不必担心是否能正常使用的问题。

我们将 nssm 下载下来。


下载链接:https://pan.baidu.com/s/1_MIo8YPGKJPMjoIeYGtsWQ

提取码:


输入密码,继续阅读



扫码关注微信公众号,回复文章ID免费获取密码


<文章ID:000945>


将压缩包解压,发现其中有两个名字分别是 Win32Win64 的文件夹,它们分别包含了32位和64位的 nssm.exe 可执行文件。


实际上你用哪个都是可以的,不过可能有些场合下,64位系统在使用32位程序时会不起作用,这时应该对应地使用64位版本。


如何安装

nssm.exe 是一个独立文件,不需要我们安装它,直接拿来用就行。

不过需要我们注意的是,nssm 工作的时候会将自己注册为事件日志消息,这就提醒我们务必要确保每一个不同的实例之间应该有相应不同的访问路径。

简而言之,就是当我们需要运行多个不同的服务时,我们应该将 nssm.exe 分别拷贝到各个对象应用程序目录中,而每个 nssm 注册为服务时就不会互相影响了。


尝试使用

直接双击 nssm.exe 文件,弹出详细的使用方法,看样子应该使用命令行的方式啊!


明白了,我们先找了一个以前自制的小游戏程序试试吧。


按照前面提示过的,我们先打条安装服务的命令。

注意,命令提示符窗口要以管理员身份运行哦!

# LightsOut是服务名,我自己随便取的
nssm.exe install LightsOut
 

输完命令后回车,GUI 界面果然出现了!


然后官网介绍的用法,我们只要在 Path 一项中简单地填入应用程序所在的完全路径,注意这是唯一一个必填项哦!

如果没有什么特殊的,那么启动目录 Startup directory 自动会变成应用程序所在目录。

至于参数 Arguments 一项,当前的程序并没有什么参数,因此可以省略。


好了,别的什么都不要做,我们点击安装服务 Install service 按钮。

嘿!它居然说安装成功了!


赶紧去 Windows 服务管理器中查看,的确有一项名为 LightsOut 的新建服务。

不过怎么打开属性看时,其可执行文件的路径写的是 nssm.exe 的路径。

看到这儿小伙伴们可不要感觉奇怪,前面也说过,nssm 会将自己注册到服务。


nssm 会不会带动我们的应用程序运行服务呢?

总之我们先尝试启动这个服务看看,嗯,服务好像正常启动了。


再顺手打开任务管理器,我们的应用程序 LightsOut.exe 确实也正在运行中,同时 nssm.exe 也在运行,它们两个都是以 SYSTEM 身份运行,看样子服务启动没问题。


有的小伙伴会说,我怎么看不到程序界面,实际上以服务形式(通常是 SYSTEM 用户身份)运行程序通常是看不到界面的,也就是无法通过界面来操作程序。

所以说大家就不要想着以跑服务的形式来玩游戏了。


其他设定

nssm 最简单注册服务的方法就如前面介绍的那样,只需要一个应用程序的路径即可。

如果我们还想要进一步完善服务设置,那么接下来还应该做些工作。


详细信息

在此可以写上一些容易标识当前服务程序的内容。

nssm set <服务名称> DisplayName <服务显示名称>
nssm set <服务名称> Description <服务详细描述>
nssm set <服务名称> Start SERVICE_AUTO_START
 


登录身份

默认是本地系统帐户,也就是 SYSTEM

此外还可以设定是否与桌面交互,或使用其他登录身份。

nssm set <服务名称> ObjectName LocalSystem
nssm set <服务名称> Type SERVICE_WIN32_OWN_PROCESS
 


依赖服务

当前服务依赖哪些服务,可以将这些服务填写在这里。

nssm set <服务名称> DependOnService <所依赖服务名称>
 


进程

程序进程优先级,以及处理器分配等等,通常保持默认即可。

nssm set <服务名称> AppPriority NORMAL_PRIORITY_CLASS
nssm set <服务名称> AppNoConsole 0
nssm set <服务名称> AppAffinity All
 


关闭服务

服务如何关闭、退出,这里有几种方式。

nssm set <服务名称> AppStopMethodSkip 0
nssm set <服务名称> AppStopMethodConsole 1500
nssm set <服务名称> AppStopMethodWindow 1500
nssm set <服务名称> AppStopMethodThreads 1500
 


退出操作

退出操作可用于调整服务退出时的重启限制和默认操作、重启间隔延迟等等。

nssm set <服务名称> AppThrottle 1500
nssm set <服务名称> AppExit Default Restart
nssm set <服务名称> AppRestartDelay 0
 


I/O

输入/输出可以帮我们设定一些比如应用程序日志消息等等。

nssm set <服务名称> AppStdout C:\sysadm\logs\service.log
nssm set <服务名称> AppStderr C:\sysadm\logs\error.log
 


文件轮换

网络上有些教程并没有写清楚这玩意到底是啥意思。

实际上它是指多文件设定,啥意思呢,就是写完一个文件后重新再写一个文件。

举例来说,比如一个日志文件,我们不可能让它一直写下去,最终它变得非常庞大,导致你的头也变大。

因此,通过文件轮换,那么我们可以将一份日志分成几个文件。

具体怎么分呢?

可以是有时间间隔的,比如过多久轮换(写一个)新文件,旧文件就不管了。

也可以是有大小阈值的,比如旧文件大到一定程度,那么我们就重新启用一个新文件。

这种文件轮换方式可以和 I/O 结合使用。

nssm set <服务名称> AppStdoutCreationDisposition 4
nssm set <服务名称> AppStderrCreationDisposition 4
nssm set <服务名称> AppRotateFiles 1
nssm set <服务名称> AppRotateOnline 0
nssm set <服务名称> AppRotateSeconds 86400
nssm set <服务名称> AppRotateBytes 1048576
 


环境变量

这个很好理解,可以为服务程序提供环境变量访问相应资源。

nssm set <服务名称> AppEnvironmentExtra TEMP=C:\Temp
nssm set <服务名称> AppEnvironmentExtra JAVA_HOME=C:\Java\bin GO_HOME=C:\Go\bin
 


编辑服务

通常使用 getset 来为服务获取或设置一些参数,前面也有过示例。

nssm.exe get <服务名称> <参数>
nssm.exe get <服务名称> <参数> <子参数>

nssm.exe set <服务名称> <参数> <值>
nssm.exe set <服务名称> <参数> <子参数> <值>
 


如果你嫌麻烦,想将参数重置为默认值,那就直接用 reset 参数吧。

nssm.exe reset <服务名称> <参数>
nssm.exe reset <服务名称> <参数> <子参数>
 


操作服务

# 启动服务
nssm.exe start <服务名称>

# 停止服务
nssm.exe stop <服务名称>

# 重启服务
nssm.exe restart <服务名称>

# 暂停服务
nssm.exe pause <服务名称>

# 查看状态
nssm.exe status <服务名称>

# 文件轮换
nssm.exe rotate <服务名称>
 


卸载服务

很简单,带上 remove 卸载参数即可。

nssm.exe remove <服务名称>
 


写在最后

除了将标准可执行文件作为服务运行之外,nssm 还可以管理诸如 batcmd 之类的批处理。

还有,nssm 是支持网络路径中的应用程序的,但不应该使用如 Z:\ 这样的网络驱动器路径,而应该使用 UNC 这种完整网络路径,比如 \\server\share

还有很多其他比较复杂的用法,大家可以到官网上查询。

对于我们小白来说,只需基本的简单的步骤就够用了。

亲爱的小伙伴们,今天你们会学废了吗?


扫码关注@网管小贾,个人微信:sysadmcc

网管小贾 / sysadm.cc



提交评论

安全码
刷新

© 2020-present 网管小贾 | 微信公众号 @网管小贾
许可协议:CC-BY-NC 4.0 | 转载文章请注明作者出处及相关链接