这是我最近在帮助一个项目配置CI/CD的时候遇到的case,环境是这样的: java程序jar包运行在windows服务器上。
- 遇到的问题:CI/CD步骤是这样的,通过jenkins slave(windows)构建生成jar包,然后通过powershell部署将jar包传到应用服务器并启动jar。过一段时间,java程序就自动退出了,可能是2小时,也可能是5小时或者10小时。但是没有超过12小时肯定就退出了。 无论程序提供的服务是否接收请求。
- 直接在服务器上打开cmd,使用java -jar 命令运行jar包没问题。
问题分析:初步怀疑是因为session长时间没有连接,被windows给回收了。但是最终也没有定位到问题的根本原因。
解决过程:就是尝试各种powershell远程启动java的方式。整理一下:
作为后台任务运行
Invoke-Command -Session $session -Scriptblock{
'java -jar demo.jar'
} -AsJob -JobName demo
使用 invoke-expression命令运行,作为后台任务或者不作为后台任务。
Invoke-Command -Session $session -Scriptblock{
invoke-expression -command 'java -jar demo.jar'
} -AsJob -JobName demo
使用CMD命令运行(作为后台任务或者不作为后台任务)
Invoke-Command -Session $session -Scriptblock{
CMD.EXE /C "java -jar demo.jar"
}
使用 Start-Process 后台运行(作为后台任务或者不作为后台任务)
Invoke-Command -Session $session -Scriptblock{
Start-Process java -ArgumentList '-jar', ‘demo.jar'
}
使用 -InDisconnectedSession 参数,官方文档解释,这个参数是在session退出是程序仍然运行。但还是无效。这个参数不能与session 和 -AsJob一同使用
Invoke-Command -ComputerName $server -Credential $cre -InDisconnectedSession -Scriptblock{
CMD.EXE /C "java -jar demo.jar"
}
在应用服务器写一个powershell脚本(也试过bat脚本),调用这个脚本启动java程序。直接在服务器上运行这个脚本是没问题的,远程通过jenkins调用还是一样的问题,运行一段时间不定时退出。
Invoke-Command -ComputerName $server -Credential $cre -InDisconnectedSession -Scriptblock{
& "C:\startup.ps1"
}
最终将java程序作为服务启动,解决了这个问题,下面说一下具体配置(以下部分转自其它文章,稍加修改):
第一步:将java程序配置为windows服务
spring官方推荐使用winsw来将springboot项目作为服务运行,参考https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#deployment-windows
1.把java程序打包为jar包
2.下载winsw
winsw是一款可将可执行程序安装成Windows Service的开源工具,github:https://github.com/kohsuke/winsw/releases
下载文件:
需要将winsw执行程序跟xml改成同样的名字:
修改spider-1.0.xml文件内容
<configuration>
<id>SpiderService</id>
<name>SpiderService</name>
<description>This is Spider service.</description>
<executable>java</executable>
<arguments>-jar spider-1.0.jar</arguments>
<!-- 开机启动 -->
<startmode>Automatic</startmode>
<!-- 日志配置 -->
<logpath>logs/service</logpath>
<logmode>rotate</logmode>
</configuration>
配置完成后,命令行进入winsw所在的文件夹(这里需要以管理员权限运行,windows开始菜单,在列表中找到cmd程序,右键点击,以管理员身份运行),执行“spider-1.0.exe install”,就注册服务了。
如果不再需要这个服务,使用spider-1.0.exe uninstall即可卸载服务。start启动和stop关闭服务。
第二步:用powershell远程启动服务
停止服务:
Invoke-Command -Session $session -Scriptblock{
Stop-Service SpiderService
}
启动服务:
Invoke-Command -Session $session -Scriptblock{
Start-Service SpiderService
}