Jenkins 部署Jar到远程windows服务器

70 阅读1分钟

踩坑点:

通过SSH远程windows进行操作,比如java -jar 或者 javaw -jar这种命令,当你的SSH连接已断开,你的java程序也会停止 。

分析

  1. 父进程终止导致子进程终止:在Unix和类Unix系统中(包括Windows的某些实现,如Cygwin),如果一个进程启动了其他进程,当父进程终止时,操作系统通常会发送一个信号(通常是SIGTERM)给所有子进程,要求它们也终止。这是为了防止僵尸进程(zombie processes)的产生,即已经结束但其父进程尚未回收其资源的进程。
  2. Java应用程序依赖于SSH会话:如果你的Java应用程序直接依赖于SSH会话(例如,通过某些特定的库或框架),那么当SSH连接断开时,这些依赖可能会受到影响,导致程序异常终止。

解决方案

将Java应用程序配置为Windows服务。这样,即使SSH会话断开,服务也会继续运行。

winsw

Windows Service Wrapper可用于包装和管理作为Windows服务的自定义进程

下载地址:github.com/winsw/winsw…

​编辑
1.启动脚本 start.bat
java -jar test.jar
2.停止脚本 stop.bat
@echo off
title 关闭某一端口
set port=8088
for /f "tokens=1-5" %%i in ('netstat -ano^|findstr ":%port%"') do (taskkill /f /pid %%m)
pause
3.winsw配置文件

test.xml 为了方便,使用项目名称即可

name是windows -> 服务 -> 服务名称

<service>
  <id>Test</id>
  <name>Test</name>
  <description>Test Jar</description>
  <executable>%BASH%\start.bat</executable>
  <stopexecutable>%BASH%\stop.bat</stopexecutable>
</service>
4.服务安装
winsw.exe install
5.启动和停止服务
#启动服务
winsw.exe start 
#关闭服务
winsw.exe stop