Mars‘s docMars‘s doc
🏠主页
  • 🍻Activiti

    • 01-核心API
    • 02-监听
    • 03-数据库表介绍
    • 04-常见问题
  • 📊JasperReport

    • 01-JaspersoftStudio工具使用
    • 02-JasperReport集成
    • 03-JasperReport常见问题
  • 🎬JavaScript

    • 01-Node
    • 02-VuePress
    • 03-Vue组件高度宽度
    • 04-显示器和屏幕高度
    • 05-页面地址
    • 06-归纳总结
  • 🍵Java

    • 01-Java8特性
    • 02-多线程
    • 03-Jar包
    • 04-Util
    • 05-validation注解
    • 06-反编译
    • 07-try-with-resource
    • 08-ThreadLocal内存泄漏
    • 09-Jvm
    • 10-Excel
    • 11-Lombook
    • 12-条件注解
    • 13-WebMvcConfigurationSupport
    • 14-WebMvcConfigurer
    • 15-分布式锁
    • 16-Caffeine
    • 17-DynamicDatasource
    • 18-MybatisPlus
    • 19-Swagger
    • 20-BeanPostProcessor
    • 21-Bean初始化
    • 22-ConfigurableApplicationContext
    • 23-常用注解
    • 24-ApplicationListener
    • 25-JavaDoc
    • 26-Spring-Cache
    • 27-StopWatch耗时统计
    • 28-Word
    • 29-Druid
    • 30-OpenFeign
    • 31-反射相关
    • 32-Fastjson
    • 33-Yaml
  • 💻Linux

    • 01-Linux常用命令
    • 02-Linux脚本汇总
    • 03-Yum源
    • 04-Debian
    • 05-Ubuntu
  • 🐋Docker

    • 01-Docker常用命令
    • 02-Dockerfile
    • 03-Swarm
    • 04-Stack
    • 05-Docker常见问题
    • 06-DockerCompose
    • 07-Docker应用用汇总
    • 08-Kasm
    • 09-Rustdesk
  • 🌐Nginx

    • 01-Nginx
  • 📈数据库

    • 01-Mysql
    • 02-Clickhouse
    • 03-Doris
    • 04-DRDS
  • 📉Kettle

    • 01-入门
    • 02-js脚本
    • 03-优化
    • 04-连接组件
    • 05-参数
    • 06-工具
    • 07-日志
    • 08-流程组件
    • 09-输入组件
    • 10-输出组件
    • 11-转换组件
    • 12-驱动
  • 🎨Git

    • 01-Git使用
  • 📝Maven

    • 01-Maven使用
    • 02-Maven配置
  • 🎯Jenkins

    • 01-Jenkins部署
    • 02-Jenkisn常见问题
  • 01-设计模式之禅
  • 02-领域驱动设计
  • 03-JavaScript高级程序设计
  • 🍓树莓派

    • 01-RaspBerry
  • 📘Markdown

    • 01-Markdown语法
    • 02-Markdown表情
    • 03-Markdown代码块语言对照
  • 📇其他

    • 01-HTML XML 转义
    • 02-GitHub
    • 03-Idea
    • 04-Nmon
    • 05-Windows
    • 06-WinSw
GitHub
🏠主页
  • 🍻Activiti

    • 01-核心API
    • 02-监听
    • 03-数据库表介绍
    • 04-常见问题
  • 📊JasperReport

    • 01-JaspersoftStudio工具使用
    • 02-JasperReport集成
    • 03-JasperReport常见问题
  • 🎬JavaScript

    • 01-Node
    • 02-VuePress
    • 03-Vue组件高度宽度
    • 04-显示器和屏幕高度
    • 05-页面地址
    • 06-归纳总结
  • 🍵Java

    • 01-Java8特性
    • 02-多线程
    • 03-Jar包
    • 04-Util
    • 05-validation注解
    • 06-反编译
    • 07-try-with-resource
    • 08-ThreadLocal内存泄漏
    • 09-Jvm
    • 10-Excel
    • 11-Lombook
    • 12-条件注解
    • 13-WebMvcConfigurationSupport
    • 14-WebMvcConfigurer
    • 15-分布式锁
    • 16-Caffeine
    • 17-DynamicDatasource
    • 18-MybatisPlus
    • 19-Swagger
    • 20-BeanPostProcessor
    • 21-Bean初始化
    • 22-ConfigurableApplicationContext
    • 23-常用注解
    • 24-ApplicationListener
    • 25-JavaDoc
    • 26-Spring-Cache
    • 27-StopWatch耗时统计
    • 28-Word
    • 29-Druid
    • 30-OpenFeign
    • 31-反射相关
    • 32-Fastjson
    • 33-Yaml
  • 💻Linux

    • 01-Linux常用命令
    • 02-Linux脚本汇总
    • 03-Yum源
    • 04-Debian
    • 05-Ubuntu
  • 🐋Docker

    • 01-Docker常用命令
    • 02-Dockerfile
    • 03-Swarm
    • 04-Stack
    • 05-Docker常见问题
    • 06-DockerCompose
    • 07-Docker应用用汇总
    • 08-Kasm
    • 09-Rustdesk
  • 🌐Nginx

    • 01-Nginx
  • 📈数据库

    • 01-Mysql
    • 02-Clickhouse
    • 03-Doris
    • 04-DRDS
  • 📉Kettle

    • 01-入门
    • 02-js脚本
    • 03-优化
    • 04-连接组件
    • 05-参数
    • 06-工具
    • 07-日志
    • 08-流程组件
    • 09-输入组件
    • 10-输出组件
    • 11-转换组件
    • 12-驱动
  • 🎨Git

    • 01-Git使用
  • 📝Maven

    • 01-Maven使用
    • 02-Maven配置
  • 🎯Jenkins

    • 01-Jenkins部署
    • 02-Jenkisn常见问题
  • 01-设计模式之禅
  • 02-领域驱动设计
  • 03-JavaScript高级程序设计
  • 🍓树莓派

    • 01-RaspBerry
  • 📘Markdown

    • 01-Markdown语法
    • 02-Markdown表情
    • 03-Markdown代码块语言对照
  • 📇其他

    • 01-HTML XML 转义
    • 02-GitHub
    • 03-Idea
    • 04-Nmon
    • 05-Windows
    • 06-WinSw
GitHub
  • 🏫技术相关

    • 🍻Activiti

      • 01-核心API
      • 02-监听
      • 03-数据库表介绍
      • 04-常见问题
    • 📊JasperReport

      • 01-JaspersoftStudio工具使用
      • 02-JasperReport集成
      • 03-JasperReport常见问题
    • 🎬JavaScript

      • 01-Node
      • 02-VuePress
      • 03-Vue组件高度宽度
      • 04-显示器和屏幕高度
      • 05-页面地址
      • 06-归纳总结
    • 🍵Java

      • 01-Java8特性
      • 02-多线程
      • 03-Jar包
      • 04-Util
      • 05-validation注解
      • 06-反编译
      • 07-try-with-resource
      • 08-ThreadLocal内存泄漏
      • 09-Jvm
      • 10-Excel
      • 11-Lombook
      • 12-条件注解
      • 13-WebMvcConfigurationSupport
      • 14-WebMvcConfigurer
      • 15-分布式锁
      • 16-Caffeine
      • 17-DynamicDatasource
      • 18-MybatisPlus
      • 19-Swagger
      • 20-BeanPostProcessor
      • 21-Bean初始化
      • 22-ConfigurableApplicationContext
      • 23-常用注解
      • 24-ApplicationListener
      • 25-JavaDoc
      • 26-Spring-Cache
      • 27-StopWatch耗时统计
      • 28-Word
      • 29-Druid
      • 30-OpenFeign
      • 31-反射相关
      • 32-Fastjson
      • 33-Yaml
  • 🏢服务器

    • 💻Linux

      • 01-Linux常用命令
      • 02-Linux脚本汇总
      • 03-Yum源
      • 04-Debian
      • 05-Ubuntu
    • 🐋Docker

      • 01-Docker常用命令
      • 02-Dockerfile
      • 03-Swarm
      • 04-Stack
      • 05-Docker常见问题
      • 06-DockerCompose
      • 07-Docker应用用汇总
      • 08-Kasm
      • 09-Rustdesk
    • 🌐Nginx

      • 01-Nginx
  • 🏩数据相关

    • 📈数据库

      • 01-Mysql
      • 02-Clickhouse
      • 03-Doris
      • 04-DRDS
    • 📉Kettle

      • 01-入门
      • 02-js脚本
      • 03-优化
      • 04-连接组件
      • 05-参数
      • 06-工具
      • 07-日志
      • 08-流程组件
      • 09-输入组件
      • 10-输出组件
      • 11-转换组件
      • 12-驱动
  • 🏬管理工具

    • 🎨Git

      • 01-Git使用
    • 📝Maven

      • 01-Maven使用
      • 02-Maven配置
    • 🎯Jenkins

      • 01-Jenkins部署
      • 02-Jenkisn常见问题
  • 🏯书籍笔记

    • 01-设计模式之禅
    • 02-领域驱动设计
    • 03-JavaScript高级程序设计
  • 🏦其他

    • 🍓树莓派

      • 01-RaspBerry
    • 📘Markdown

      • 01-Markdown语法
      • 02-Markdown表情
      • 03-Markdown代码块语言对照
    • 📇其他

      • 01-HTML XML 转义
      • 02-GitHub
      • 03-Idea
      • 04-Nmon
      • 05-Windows
      • 06-WinSw

WinSw

什么是 WinSw

首先看看 WinSw官方的介绍

WinSW wraps and manages any application as a Windows service.

翻译过来的意思就是,WinSW 可以将任何应用程序>打包并作为 Windows 服务进行管理。

划重点,Windows 服务可以通过 services.msc 进行管理,随着 Windows 自启动等。

开始使用 WinSw

WinSw 支持 全局和捆绑两种使用方式

Use WinSW as a global tool

  • Take WinSW.exe or WinSW.zip from the distribution.
  • Write myapp.xml (see the XML config file specification and samples for more details).
  • Run winsw install myapp.xml [options] to install the service.
  • Run winsw start myapp.xml to start the service.
  • Run winsw status myapp.xml to see if your service is up and running.

Use WinSW as a bundled tool

  • Take WinSW.exe or WinSW.zip from the distribution, and rename the .exe to your taste (such as myapp.exe).
  • Write myapp.xml (see the XML config file specification and samples for more details).
  • Place those two files side by side, because that's how WinSW discovers its co-related configuration.
  • Run myapp.exe install [options] to install the service.
  • Run myapp.exe start to start the service.

官方给出了一个 Jenkins 的例子。

<service>
    <id>jenkins</id>
    <name>Jenkins</name>
    <description>This service runs Jenkins continuous integration system.</description>
    <env name="JENKINS_HOME" value="%BASE%"/>
    <executable>java</executable>
    <arguments>-Xrs -Xmx256m -jar "%BASE%\jenkins.war" --httpPort=8080</arguments>
    <log mode="roll"></log>
</service>

划重点,通过官方例子可以得出一个结论,只要是在 Windows 下能执行的应用(文件、脚本、.exe 、.bat 、.jar……)都可以通过 WinSw 注册为 Windows 服务。

如何使用 WinSw

首先通过前面内容可以猜到 WinSw 是通过其配置文件进行管理的。

WinSw 支持的命令,官方内容如下

CommandDescription
installInstalls the service.
uninstallUninstalls the service.
startStarts the service.
stopStops the service.
restartStops and then starts the service.
statusChecks the status of the service.
refreshRefreshes the service properties without reinstallation.
customizeCustomizes the wrapper executable.
devExperimental commands.

使用实例

1. nginx

场景:

统一认证服务部署在内网,但微信、钉钉等认证需要通过等其官方(公网)的验证才能获取 token 。 此时就需要一台前置服务(nginx)作为内网外往通信的桥梁,但是大家都知道 Windows 运行的不稳定性。 如何确保前置机的稳定运行呢?

方案:

把 nginx 作为 Windows 服务来进行管理,随着 Windows 的启动而启动。 PS:如果 Windows 没启动,其他都不用谈了~~~

首先,创建一个 nginx-service.xml 配置文件

<!-- nginx-service.xml -->
<service>
    <id>nginx</id>
    <name>nginx</name>
    <description>nginx</description>
    <startmode>Automatic</startmode>
    <executable>%BASE%\nginx.exe</executable>
    <logpath>%BASE%\logs\</logpath>
    <log mode="append">rotate</log>
</service>

其次,将 WinSw.exe 重命名为 nginx-service.xml

然后,安装 nginx 服务

nginx-service.exe install

最后,启动 nginx 服务

nginx-service start

为了方便使用,可以把管理命令作为脚本。

部署脚本

# instal.bat
@echo off
:color 2f
chcp 65001
mode con: cols=80 lines=25
echo 请按任意键开始安装后台服务...&pause>nul

nginx-service.exe install

echo 部署完成!
echo.
pause

启动脚本

# start.bat
@echo off
:color 2f
chcp 65001
mode con: cols=80 lines=25
echo 请按任意键开始启动nginx后台服务...&pause>nul

nginx-service start

echo.

echo nginx进程
tasklist /fi "imagename eq nginx.exe"

echo 请确认nginx进程是否存在,如进程未正常打印,请检查nginx安装目录下logs目录下日志,并重新启动
echo.

echo 启动完成!
echo.
pause

停止脚本

# stop.bat
@echo off
:color 2f
chcp 65001
mode con: cols=80 lines=25
echo 请按任意键开始停止nginx后台服务...&pause>nul

%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit

cd /d "%~dp0"

echo nginx进程
tasklist /fi "imagename eq nginx.exe"

echo.
taskkill /f /fi "IMAGENAME eq nginx.exe*"

echo.
echo 请确认nginx进程是否存在,如进程依然存在,请检查nginx安装目录下logs目录下日志,并重新停止
echo.

echo 停止完成!
echo.
pause

卸载脚本

# uninstall.bat
@echo off
:color 2f
chcp 65001
mode con: cols=80 lines=25
echo 请按任意键开始卸载nginx后台服务...&pause>nul

.\nginx-service.exe uninstall

echo 卸载完成!
echo.
pause

2. jar

配置文件

<service>
    <!--安装成Windows服务后的服务名-->
    <id>hcbp-devops-warnning</id>
    <!--显示的服务名称-->
    <name>hcbp-devops-warnning</name>
    <!--对服务的描述-->
    <description>hcbp-devops-warnning</description>
    <env name="HCBP_JRE_HOME" value="%Base%"/>
    <executable>java</executable>
    <arguments>-jar .\hcbp-devops-warnning.jar -Xmx512m -Xms512m
        --spring.config.additional-location=.\hcbp-devops-warnning.yml
    </arguments>
    <!--让服务自动启动-->
    <startmode>Automatic</startmode>
    <!--日志路径-->
    <logpath>./logs</logpath>
    <!--日志模式-->
    <log mode="roll-by-size-time">
        <sizeThreshold>10240</sizeThreshold>
        <pattern>yyyyMMdd</pattern>
        <autoRollAtTime>00:00:00</autoRollAtTime>
        <zipOlderThanNumDays>5</zipOlderThanNumDays>
        <zipDateFormat>yyyyMM</zipDateFormat>
    </log>
</service>

部署脚本

@echo off
chcp 65001
setlocal enabledelayedexpansion
echo 开始配置java环境
set "HCBP_JRE_HOME=%cd%\jre-1.8-x32"
echo 环境变量添加HCBP_JRE_HOME
setx /m HCBP_JRE_HOME %cd%\jre-1.8-x32 > nul
set "newPath=%HCBP_JRE_HOME%\bin"
echo %PATH% | findstr /C:"%newPath%" > nul
if %errorlevel% == 0 (
    echo PATH中HCBP_JRE_HOME已存在,正在替换...
    set "newPathList="
    for %%i in (%PATH%) do (
        if /I "%%i"=="%newPath%" (
            set "newPathList=!newPathList!;%%i"
        ) else (
            set "newPathList=!newPathList!;%%i"
        )
    )
    rem 添加新路径
    set "newPathList=!newPathList!;%newPath%"
    setx PATH "!newPathList:~1!" >nul
) else (
    echo PATH中HCBP_JRE_HOME不存在,正在替换...
    setx /m PATH "%PATH%;%newPath%" >nul
)
echo java环境配置完成!

echo 部署hcbp-devops-warnning
hcbp-devops-warnning.exe install
echo 部署完成!
echo.
endlocal
pause

启动脚本

@echo off
chcp 65001
hcbp-devops-warnning.exe start
echo.
echo 日志路径:%cd%\logs
echo 验证:http://127.0.0.1:10001/warnning/doc.html#/home
echo.
pause

停止脚本

@echo off
chcp 65001
hcbp-devops-warnning.exe stop
pause

卸载脚本

@echo off
chcp 65001
hcbp-devops-warnning.exe uninstall
pause
Edit this page
Last Updated:
Contributors: wangxiaoquan
Prev
05-Windows