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.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 常用命令
命令 | 说明 |
---|---|
install | Installs the service. |
uninstall | Uninstalls the service. |
start | Starts the service. |
stop | Stops the service. |
restart | Stops and then starts the service. |
status | Checks the status of the service. |
refresh | Refreshes the service properties without reinstallation. |
customize | Customizes the wrapper executable. |
dev | Experimental commands. |