关于在windows平台下将应用制做成windows服务及服务依赖的感想

在某些状况下,应用须要部署在windows平台下,单纯的手动点击exe执行文件或java -jar xxx.jar在实际生产环境中不是最佳实践(制做成bat启动文件置于启动项里,服务器启动后,须要人工输入登陆帐号才能启动应用服务)。此时咱们须要将应用制做成windows服务设为自启动,这样在windows服务器手动重启或断电启动后,无需用户手动输入登陆帐号便可自动启动应用服务,此外,应用还可能依赖第三方服务,即只有第三方服务启动后,该应用才能正常启动运行(好比大部分web应用依赖数据库服务,redis内存数据库服务等),这时考虑将应用设置为自动(延迟启动)或设置服务依赖关系。下面将提供实际安装脚本。java

对于某些应用好比tomcat,redis等自己提供了windows服务安装脚本,此时咱们只须要按照使用方法安装服务便可(后面会提供tomcat和redis的windows服务安装脚本)。但对于大部分应用,好比nginx,大部分exe应用,咱们须要借助第三方工具将其封装为windows服务。这里笔者推荐使用winsw,在利用winsw将nginx封装为windows服务过程当中,笔者狠狠踩了两个大坑,不过借助强大的互联网共享精神,算是完美填补了大坑。好了,闲话少讲,来点干货。mysql

tomcat服务安装脚本service_install.bat:nginx

@echo off
D:
cd D:\runtime\program\tomcat-8.0.43\bin 
service.bat install myWebApp   :利用tomcat自身提供的service.bat文件输入install serviceName 便可安装为windows服务,同时能够经过修改service.bat文件作一些定制化的东西

tomcat服务卸载脚本service_uninstall.bat:web

@echo off
D:
cd D:\runtime\program\tomcat-8.0.43\bin 
service.bat remove myWebApp

redis服务安装脚本service_install.bar:redis

D:
cd D:\runtime\support\Redis-x64-3.2.100\
redis-server.exe --service-install D:\runtime\support\Redis-x64-3.2.100\redis.windows-service.conf --service-name myRedis --loglevel verbose
pause;

redis服务卸载脚本service_uninstall.bar:sql

D:
cd D:\runtime\support\Redis-x64-3.2.100\
redis-server.exe --service-uninstall --service-name myRedis
pause;

下面介绍使用第三方工具winsw将应用程序封装为windows服务数据库

1.下载winsw.exe文件,点击这里下载;windows

2.将winsw.exe文件复制到待封装为windows服务的应用的根目录中,重命名如myService.exe;tomcat

3.在该目录中新建xml文件命名为myService.xml,内容根据不一样的应用内容不一样,下面列举常见的应用。服务器

 3.1 nginx应用的myService.xml:

<service>    
 <id>myNginx</id>    
 <name>myNginx</name>    
 <description>myNginx服务</description>
 <startmode>Automatic</startmode>
 <env name="HOME" value="D:\runtime\support\nginx-1.10.3"/>
 <executable>%HOME%\nginx.exe</executable>    
 <logpath>%HOME%\logs</logpath>
 <logmode>roll</logmode>    
 <depend></depend>    
 <startargument>-p%HOME%</startargument>
 <stopargument>-s</stopargument>  
 <stopargument>stop</stopargument>
</service> 

注意xml中的startargument中值-p后面不能有空格,stopargument分开写,不然安装好的服务会在启动时报错从而启动不成功。这是笔者所采的坑

3.2 jar包应用的myService.xml:

 

<service>    
 <id>myJarService</id>    
 <name>myJarService</name>    
 <description>myJarService服务</description>
 <startmode>Automatic</startmode>
 <executable>C:\Program Files\Java\jre1.8.0_121\bin\java.exe</executable>    
 <logpath>D:\runtime\data\log</logpath>
 <logmode>roll</logmode>    
 <depend>MySQL57</depend>
 <depend>myRedis</depend> 
 <arguments>-jar myJarApp.jar</arguments>
</service> 

 

这和在cmd命令窗口中输入执行命令 java.exe -jar myJarApp.jar 相似。其中,depend能够添加多个表示该应用依赖第三方服务,如上面的依赖mysql和redis服务,只有在mysql和redis启动以后才会启动该应用

3.3 常见exe应用的myService.xml:

<service>    
 <id>myExeApp</id>    
 <name>myExeApp</name>    
 <description>myExeApp服务</description>
 <startmode>Automatic</startmode>
<executable>D:\runtime\program\\bin\myApp.exe</executable> <logpath>D:\runtime\data\log</logpath> <logmode>roll</logmode> <depend>MySQL57</depend> </service>

4.在同级目录中建立service_install.bat,输入以下命令:

D:\应用根目录\myService.exe install
pause;

双击service_install.bat便可安装该服务。若是出现权限不足报错,请选中service_install.bat右键选择“以管理员身份运行”。

附带服务卸载脚本service_uninstall.bat

D:\应用根目录\myService.exe uninstall
pause;

 

对于大部分应用,应用的启动须要依赖第三方服务启动以后才能启动该应用,这时就须要为该服务建立依赖关系。对于winsw封装的服务,能够在xml中的depend节点配置依赖。若是不采用winsw方式,则咱们须要手动配置服务间的依赖,下面提供完整脚本。

假设serviceA依赖serviceB和serviceC。则脚本serviceAdepend.bat内容以下:

@echo off
echo ================开始为ServiceA服务建立依赖关系================

ping -n 2 127.0.0.1>nul
sc query serviceA>nul
if errorlevel 1060 (
echo 还没有安装serviceA服务,请先安装该服务.
goto end
)

ping -n 2 127.0.0.1>nul
sc query serviceB>nul
if errorlevel 1060 (
echo 还没有安装serviceB服务,请先安装该服务. 
goto end
)

ping -n
2 127.0.0.1>nul
sc query serviceC
>nul
if errorlevel 1060 (
echo 还没有安装serviceC服务,请先安装该服务.
goto end
)
runas /noprofile /user:Administrator "sc config serviceA depend= serviceB/serviceC" :使用管理员Administrator为serviceA服务建立依赖关系
echo ================
ServiceA服务依赖关系建立完成================
ping -n 8 127.0.0.1>nul
goto end
:end
pause

双击serviceAdepend.bat,执行窗体会要求输入系统管理员密码,输入正确的密码后便可自动安装依赖。

安装后可在服务列表中选择指定服务右键点击属性,转到依存关系便可看到,以下图所示:

相关文章
相关标签/搜索