前言
有时我们需要把写好的 java 程序部署在 Windows 系统的服务器上,如果服务器被人为重启,或者程序由于未知原因自己崩溃了,程序不能自动重启,用户体验很不好。接下来介绍一种可行的解决方案:设置 java 程序开机启动 + 崩溃自动重启(当然能避免程序崩溃最好,这是根本解决方法,本文的目的是给你的程序设立最后一道保障)。
实现思路
jar 包开机运行:利用 Windows 系统自带的“计划任务”工具,使得系统启动完毕后去运行一个脚本,我们在这个脚本里写入运行 jar 包的命令即可。
程序崩溃重启:继承上一步,替换掉系统启动完毕之后运行的脚本为,新建一个脚本,在其中设置定时任务,每隔一段时间去检查我们启动的进程是否存在,如不存在,表明程序崩溃,重新启动它即可。
具体实现
1. jar 包开机运行
a. 准备好要运行的jar包,例如test.jar
b. 编写启动脚本。新建一个 bat 文件,例如 test_start.bat,并写入以下内容:
@echo off
start javaw -jar E:\your\path\test.jar
exit
注:javaw命令和java类似,区别是它不会启动控制台,满足后台启动的需求
c.将 bat 脚本加入window计划任务中。设置方法如下:
在开始菜单中搜索计划任务,并打开,弹出计划任务界面,依次点击 任务计划程序库--创建任务
填入任务名称,设置使用最高权限运行
切换选项卡到“触发器”,点击新建,弹出触发器窗口,选择“启动时”,并在高级设置中设置延迟30s触发。
注:测试发现不设置延迟会导致任务启动失败,可能由于部分系统环境没有初始化完毕。
继续切换选项卡到“操作”,点击新建,在弹出的窗口中选择“启动程序”,并选择要启动的 bat 脚本所在位置,之后在“起始于”输入框中填入 bat 文件所在路径。
注:“起始于”如留空,并且在要启动的bat文件中有静默启动的代码,会导致运行bat失败,因此建议填写。
“条件”按需配置,最后进入“设置”选项卡,勾选“允许按需运行任务”,表示待会可以手动运行该计划任务(用于测试是否配置成功)。
创建成功后就可以点击运行测试。
2. 设置 java 程序崩溃重启
a. 新建 bat 文件,如test_listener.bat,写入如下内容:
@echo off
title test_listener
mode con cols=100 lines=20
color 3f
:: 设置后台启动
if "%1" == "h" goto begin
mshta vbscript:createobject("wscript.shell").run("%~nx0 h",0)(window.close)&&exit
:begin
:: 获取管理员权限
setlocal
set uac=~uac_permission_tmp_%random%
md "%SystemRoot%\system32\%uac%" 2>nul
if %errorlevel%==0 ( rd "%SystemRoot%\system32\%uac%" >nul 2>nul ) else (
echo set uac = CreateObject^("Shell.Application"^)>"%temp%\%uac%.vbs"
echo uac.ShellExecute "%~s0","","","runas",1 >>"%temp%\%uac%.vbs"
echo WScript.Quit >>"%temp%\%uac%.vbs"
"%temp%\%uac%.vbs" /f
del /f /q "%temp%\%uac%.vbs" & exit )
endlocal
:: 执行程序,定时检测运行状态,程序崩溃自动重启
set _task=javaw.exe
set _des=E:/your/path/test-start.bat
:checkstart
for /f "tokens=5" %%n in ('qprocess.exe ^| find "%_task%" ') do (
if %%n==%_task% (goto checkag) else goto startsvr
)
:startsvr
echo %time%
echo ******** program start ********
echo program start at %time%
start %_des%
set/p=.nul
echo .
echo Wscript.Sleep WScript.Arguments(0) >%tmp%/delay.vbs
cscript //b //nologo %tmp%/delay.vbs 20000
del %_des% /Q
echo ******** program start finished ********
goto checkstart
:checkag
echo %time% running normally, check again after 20s..
echo Wscript.Sleep WScript.Arguments(0) >%tmp%/delay.vbs
cscript //b //nologo %tmp%/delay.vbs 20000
goto checkstart
注:
检查的本质是查询 javaw 程序是否在运行,因此不适合有多个通过 javaw 方式启动 java 程序的情况。
set _des=E:/your/path/test-start.bat表示如发现程序奔溃,自动运行的该bat文件。test-start.bat为启动jar程序的脚本。
检查周期当前为20s,如需更改检查周期,修改这2处地方:cscript //b //nologo %tmp%/delay.vbs 20000
b. 在计划任务中,设置“操作”中启动的脚本为刚刚新建的 bat 文件(test_listener.bat),大功告成。
如有表述不清楚的地方请让我知道,如果你对文章有任何疑问,欢迎来讨论~