本文目的
公司需求用到把命令行程序作为windows服务运行,不允许出现令人烦恼的小黑框。遂开始搜查该方面的工具,于是乎便记录下来谨防忘记。
1. 需求
单独的jar包程序,python脚本,以及任何可以用命令启动运行事物安装为windows服务程序,以实现开机自启。
2. 如何实现
在github上一个3k多个star的项目,作者是kohsuke,下载链接:点击下载
若是windows10系统,建议下载最新版
笔者在这里下载了2.4.0版本作为说明示例。目录中,两个exe文件,一个是.net2版本,一个是.net4版本。pom是开发依赖库,不用在意它。
除了一个可执行文件外,还需要一个配置文件,最新的版本中配置文件也是和老版的一样是xml形式。较大的不同是新版的根节点是<service>,而老版本的是<configuration>,下面是几个基本配置项。
<service>
<id> yourself service id </id>
<name>yourself service name</name>
<description>This service runs Jenkins continuous integration system.</description>
<env name="JENKINS_HOME" value="%BASE%"/>
<executable>java</executable>
<arguments>-Xrs -Xmx256m -jar "my_winsw.jar" --httpPort=8080</arguments>
<logmode>rotate</logmode>
</service>
重要的参数:
i. executable:运行命令,可以写全路径。若是配置了env,则会自动扫描该环境变量,只用命令即可。
ii. arguments: 运行参数,除了命令之外的参数都可以写在这里。
iii. logmode: 日志记录模块,详细看这里
这两个文件弄好之后,放在同一目录(c:\example)下。exe文件推荐改为与自己服务相关的名称。接下来是安装服务。我的exe改名为my_winsw.exe.
以管理员身份打开黑色命令行窗口,切换到c:\example,执行
my_winsw.exe install
启动服务:
以管理员身份打开黑色命令行窗口,切换到c:\example,执行
net start "your_service_id"
停止服务:
以管理员身份打开黑色命令行窗口,切换到c:\example,执行
net stop "your_service_id"
重启服务:
以管理员身份打开黑色命令行窗口,切换到c:\example,执行
net restart "your_service_id"
3. 优化
我们发现每次都要去打开命令行窗口才能对服务进行一些操作,很是麻烦。既然都是命令行,我们不妨把安装,启动,停止,重启等都保存为批处理文件。
重要:
在命令行中获取管理员权限
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit cd /d "%~dp0"
例如安装.bat
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit cd /d "%~dp0"
my_winsw.exe install
最后我们的目录呈一下状态:
至此完成,windows服务的安装。