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

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

tomcat服务安装脚本service_install.bat:

@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:

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

redis服务安装脚本service_install.bar:

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:

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

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

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

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

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,执行窗体会要求输入系统管理员密码,输入正确的密码后即可自动安装依赖。

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

关于在windows平台下将应用制作成windows服务及服务依赖的感想的更多相关文章

  1. Windows平台下搭建Git服务器的图文教程

    Git没有客户端服务器端的概念,但是要共享Git仓库,就需要用到SSH协议(FTP , HTTPS , SFTP等协议也能实现Git共享,此文档不讨论),但是SSH有客户端服务器端,所以在window ...

  2. Windows平台下搭建Git服务器的图文教程(转发)

    Git没有客户端服务器端的概念,但是要共享Git仓库,就需要用到SSH协议(FTP , HTTPS , SFTP等协议也能实现Git共享,此文档不讨论),但是SSH有客户端服务器端,所以在window ...

  3. Windows平台下利用APM来做负载均衡方案 - 负载均衡(下)

    概述 我们在上一篇Windows平台分布式架构实践 - 负载均衡中讨论了Windows平台下通过NLB(Network Load Balancer) 来实现网站的负载均衡,并且通过压力测试演示了它的效 ...

  4. windows平台下基于VisualStudio的Clang安装和配置

    LLVM 是一个开源的编译器架构,它已经被成功应用到多个应用领域.Clang是 LLVM 的一个编译器前端,它目前支持 C, C++, Objective-C 以及 Objective-C++ 等编程 ...

  5. Windows平台下的读写锁

    Windows平台下的读写锁简单介绍Windows平台下的读写锁以及实现.背景介绍Windows在Vista 和 Server2008以后才开始提供读写锁API,即SRW系列函数(Initialize ...

  6. [转]Windows平台下安装Hadoop

    1.安装JDK1.6或更高版本 官网下载JDK,安装时注意,最好不要安装到带有空格的路径名下,例如:Programe Files,否则在配置Hadoop的配置文件时会找不到JDK(按相关说法,配置文件 ...

  7. MongoDB学习总结(一) —— Windows平台下安装

    > 基本概念 MongoDB是一个基于分布式文件存储的开源数据库系统,皆在为WEB应用提供可扩展的高性能数据存储解决方案.MongoDB将数据存储为一个文档,数据结构由键值key=>val ...

  8. windows平台下基于QT和OpenCV搭建图像处理平台

        在之前的博客中,已经分别比较详细地阐述了"windows平台下基于VS和OpenCV"以及"Linux平台下基于QT和OpenCV"搭建图像处理框架,并 ...

  9. Windows平台下的内存泄漏检测

    在C/C++中内存泄漏是一个不可避免的问题,很多新手甚至有许多老手也会犯这样的错误,下面说明一下在windows平台下如何检测内存泄漏. 在windows平台下内存泄漏检测的原理大致如下. 1. 在分 ...

随机推荐

  1. Apache/Nginx的web网页访问加密

  2. 2019年杭电多校第一场 1009题String(HDU6586+模拟+单调栈)

    题目链接 传送门 题意 给你一个字符串,要你构造一个长为\(k\)的子串使得每个字母出现的次数在\([L_i,R_i](0\leq i\leq26)\)间且字典序最小. 思路 做这种题目就是要保持思路 ...

  3. 遗传算法介绍并附上Python代码

    之前介绍过遗传算法,参见:https://www.cnblogs.com/LoganChen/p/7509702.html 我们用Python实现同样的问题解答. y=10*sin(5*x)+7*ab ...

  4. python爬虫中遇到的问题以及解决方法

    (1)运行后报错:“TypeError: cannot use a string pattern on a bytes-like” 原因:content用decode(‘utf-8’)进行解码,由by ...

  5. Easyui combobox 源码修改模糊查询v=1.34

    原来的匹配方式: $.fn.combobox.defaults=$.extend({},$.fn.combo.defaults,{valueField:"value",textFi ...

  6. BZOJ - 3242 :快餐店 (基环树DP) 最小化半径

    题意:给定N点N边的无向连通图,现在让你在图中找一点作为餐厅,使得最远点距离这点最近. 思路:为了保留整数,我们求最小直径,最后去除2.  直径来源于两部分: 1,在外向树中: 那么就是树的直接,一棵 ...

  7. 前段大数据传输 压缩解压 pako

    我已经找到了解决的办法:用pako.inflate(); 在页面引入链接即可调用pako

  8. 没有内置小鹤双拼的rime输入法就是差劲

    没有内置小鹤双拼的rime输入法就是差劲,还特立独行,搞什么繁体~ 没有内置小鹤双拼的rime输入法就是差劲,还特立独行,搞什么繁体~ 没有内置小鹤双拼的rime输入法就是差劲,还特立独行,搞什么繁体 ...

  9. docker 启动失败 Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.

    CentOS7安装docker,安装成功后,启动失败 提示: 我们可以看到此处它提示是Failed to start Docker Application Container Engine. 于是在网 ...

  10. VSCode 如何操作用户自定义代码片段

    自己写了一些根据自己习惯弄成的自定义代码片段,不喜跳过 很简单,快速过一下,F1,然后输入 snippets vue代码片段 { // Place your snippets for vue here ...