1,使用 exe 和 sc 方式

        之前我们使用 Spring Boot 去做 Windows 的客户端,使用 exe4j 这个工具把 jar 包打成 exe 文件,选择“服务”模式,

windows springboot服务 spring boot windows_重启

 最后使用 Windows 的 sc 命令注册该 exe 文件为 windows 服务,并设置为自动模式,失败重启。

.bat 批处理脚本

sc create xxx binpath= %~dp0xxx.exe start= auto  displayname= "xxx"
sc failure xxx reset= 5 actions= restart/3000/run/5000/reboot/8000

其中 jre 选择搜索本目录,"%~dp0"就是本目录的意思。

windows springboot服务 spring boot windows_客户端_02

jre路径一般是相对路径,也可以是绝对路径。一般是 “%~dp0/jre” ,最好“%~dp0\jre”也写上。如果都不行,就试试使用 "/jre",据说这个也是相对路径。

         当客户端更新时就下载一个新的 exe 文件到本地,使用 sc config 修改 exe 文件的地址,然后使用 taskkill 杀死服务,因为该服务有崩溃重启功能,所以过了几秒钟后,服务重启了,服务变为新服务。

sc config xxx binpath= %~dp0xxx_new.exe
taskkill /F /t /IM "xxx.exe"

        这种方式在启动几小时后可能会被操作系统杀死,最后我们找不到原因,也无法解决这个问题,就放弃了这种方式。

2,使用 sc 监控脚本的方式

        基本也和上面差不多的,它有一个监控脚本,这个监控脚本被包装为一个系统服务,一刻不停地运行,它是一个死循环的脚本,中途会睡眠一两分钟,一直监控服务是否存在,如果服务被杀死,就立即重启服务。这个脚本可以监控 exe 程序,也可以监控 jar 包方式启动的 Console 程序。

3,使用 Windows 的计划任务方式

        Windows 的计划任务在控制面板-系统和安全-计划任务,它是一个操作系统级别的定时器。谷歌浏览器 ,Bing浏览器,WPS 软件的自动更新都使用它来实现。但它需要本地管理员权限去执行脚本。需要配置如下。

windows springboot服务 spring boot windows_重启_03

 只需要一条命令就能创建计划任务。

schtasks /create /sc minute /mo 1 /tn "TaskName" /tr "%~dp0monitor.bat"

它会每隔一分钟去执行当前目录的 monitor 监控脚本。我们在监控脚本里使用 tasklist 去检测我们的进程,当进程被杀死时就会重启进程。 在当前目录有一个 version.txt 文件,它记录了当前进程的版本号,当我们要升级客户端时,先下载好目标客户端,再改写 version.txt 内容为目标客户端的名称,让后让程序停止运行,一分钟内,计划任务要执行的监控脚本就会把新版本的客户端启动起来。     PS:不要使用 jps 去监控 java 程序是否存在,它有可能不准确,应该使用 tasklist 去监控。