这是我最近在帮助一个项目配置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
    }
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐