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


    在某些情况下,应用需要部署在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:
    untimeprogram	omcat-8.0.43bin 
    service.bat install myWebApp   :利用tomcat自身提供的service.bat文件输入install serviceName 即可安装为windows服务,同时可以通过修改service.bat文件做一些定制化的东西

    tomcat服务卸载脚本service_uninstall.bat:

    @echo off
    D:
    cd D:
    untimeprogram	omcat-8.0.43bin 
    service.bat remove myWebApp

    redis服务安装脚本service_install.bar:

    D:
    cd D:
    untimesupportRedis-x64-3.2.100
    redis-server.exe --service-install D:
    untimesupportRedis-x64-3.2.100
    edis.windows-service.conf --service-name myRedis --loglevel verbose
    pause;

    redis服务卸载脚本service_uninstall.bar:

    D:
    cd D:
    untimesupportRedis-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:
    untimesupport
    ginx-1.10.3"/>
     <executable>%HOME%
    ginx.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 FilesJavajre1.8.0_121injava.exe</executable>    
     <logpath>D:
    untimedatalog</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: untimeprogram\binmyApp.exe</executable> <logpath>D: untimedatalog</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,执行窗体会要求输入系统管理员密码,输入正确的密码后即可自动安装依赖。

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

  • 相关阅读:
    Kubernetes 命令行工具之kubctl
    新一代数据库之Etcd 简介
    算法题 打家劫舍(动态规划)
    算法题 位1的个数
    Class强制类型转换
    算法题 阶乘后的零
    算法题 Excel表列序号
    多数元素
    有序数组两数之和
    一杯果汁和一杯水的故事
  • 原文地址:https://www.cnblogs.com/franson-2016/p/11672666.html
Copyright © 2020-2023  润新知