利用winsw工具包装任何Windows程序作为服务

1、winsw介绍

有时候我们需要在Windows下开机运行某些程序,这对于有图形界面的程序来说一般不是什么事,在选项中选中开机启动,然后它们就可以自动运行了。但是如果我们想运行一些命令行程序的话就没这么方便了。

早期的办法是写一个bat脚本,然后将它的快捷方式复制到 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp,这样就可以开机自启了。不过这种方式有一个非常大的缺点,就是开机之后会显示一个命令行窗口!而且这个窗口还不能关,一关程序就停了。

其实Windows自带了一个后台程序管理的功能,就是我们经常用到的【服务】。但是Windows的服务只有程序的开发者在写程序的时候引用到这个功能,我们才能利用服务来控制程序的启动和关闭。对于一般的命令行程序来说,没办法利用服务。

接下我将介绍一下winsw工具——它可以将Windows上的任何一个程序注册为服务,如果不需要,也可以方便的卸载服务。

2、使用winsw

2.1 下载

winsw是一个开源软件,我们可以Github上下载,一般来说当然是下载最新的。winsw可以运行在.NET2和.NET4两个版本上,当然如果使用Win10等比较新的系统,最好下载更新版本的.NET。

下载winsw

下载完之后你可以随意把文件改成一个比较短小的名字,例如winsw.exe这样的,方便后面输入命令。

2.2 编写配置文件

我们需要编写一个和程序同名的XML文件作为winsw的配置文件。文件大体上长这样,这是官网的例子。

<service>
<id>jenkins</id>
<name>Jenkins</name>
<description>This service runs Jenkins continuous integration system.</description>
<env name="JENKINS_HOME" value="%BASE%"/>
<executable>java</executable>
<arguments>-Xrs -Xmx256m -jar "%BASE%\jenkins.war" --httpPort=8080</arguments>
<logmode>rotate</logmode>
</service>

以下是我用来将我的nginx.exe包装为系统服务的案例:

<service>
    <id>NginxService</id>
    <name>JianJi Nginx Service</name>
    <description>nginx服务</description>
    <env name="BASE" value="%BASE%"/>
    <executable>nginx.exe</executable>
 <stopexecutable>%BASE%\nginx.exe</stopexecutable>
    <stopargument>-s</stopargument>
    <stopargument>stop</stopargument>
<logmode>none</logmode>
<delayedAutoStart>true</delayedAutoStart>
</service>

2.3 注册服务

编写好配置文件之后,记得把配置文件和可执行文件放在一起,这样winsw才能正确识别配置文件。然后我们打开一个管理员权限的命令提示符或Powershell窗口,然后输入下面的命令,如果返回值为0,说明已将程序注册为服务。

NginxService install

然后打开Windows的服务,我们可以看到这下已经出现了注册的服务,我们可以像一般服务那样开启、关闭它。

如果不再需要这个服务,使用NginxService uninstall即可卸载服务。当然还有诸如start、stop这样的命令启动和关闭服务。

2.4 常用命令

命令说明
installInstalls the service.
uninstallUninstalls the service.
startStarts the service.
stopStops the service.
restartStops and then starts the service.
statusChecks the status of the service.
refreshRefreshes the service properties without reinstallation.
customizeCustomizes the wrapper executable.
devExperimental commands.

文章目录