在某些情况下,应用需要部署在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. 不用虚拟机直接在线用的 Linux,统统都在这里!

    玩过 Linux 的同学,几乎都用过虚拟机!然而,你们肯定不晓得?不用装虚拟机,也有体验 Linux 的办法.下面一起来看看吧,到底如何不用虚拟机,照样能玩 Linux. 其实方法很简单,你只需要拥有 ...

  2. Introduction to Linux Threads

    Introduction to Linux Threads A thread of execution is often regarded as the smallest unit of proces ...

  3. Jenkins中如何实现debug配置

    java -jar -Xmx512m -Dfile.encoding=UTF-8 -server -XX:-OmitStackTraceInFastThrow -server -agentlib:jd ...

  4. Linux 挂载windows共享文件夹

    Linux 挂载windows共享文件夹 准备工具: 1.windows 共享出来文件夹. 2.Linux 安装cifs文件挂载属性 3.其他 windows ip: 192.168.27.99 Li ...

  5. loadrunner自动订票脚本通用;loadrunner脚本参数化,设置检查点

    Action() { web_reg_find("Text=Web Tours", LAST); web_reg_save_param("session", & ...

  6. 1062 Error 'Duplicate entry '1438019' for key 'PRIMARY'' on query

    mysql主从库同步错误:1062 Error 'Duplicate entry '1438019' for key 'PRIMARY'' on querymysql主从库在同步时会发生1062 La ...

  7. Django 的 cbv

    Django 的 cbv 正如我们了解到的,Django 写视图函数有两种写法:cbv 和 fbv.cbv 提倡使用类来写,fbv 使用函数来 写.当然为了代码的重复行,官方更推荐使用 cbv. 写 ...

  8. nuxt 项目设置缩进为4个空格

    1..editorconfig 文件下的indent_size: 2更改为indent_size: 4 2..prettierrc 文件 { "singleQuote": true ...

  9. git 学习记录—— git 中的仓库、文件状态、修改和提交操作等

    最近开始学习使用版本控制工具  git .学习方式主要通过阅读 git 网站上的 Pro git 和动手实践,使用的系统为 Ubuntu16.04LTS,以及 Windows 8.1. 本文主要关注 ...

  10. 20180414模拟赛T2——拼图

    拼图 源程序名 puzzling.??? (PAS,BAS,C,CPP) 可执行文件名 puzzling.EXE 输入文件名 puzzling.IN 输出文件名 puzzling.OUT 时间限制 1 ...