windows 设置 java 程序开机启动 + 崩溃重启

前言

有时我们需要把写好的 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
for /L %%i in (1 1 10) do set /p a=.<nul&ping.exe /n 2 127.0.0.1>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

注:

  1. 检查的本质是查询 javaw 程序是否在运行,因此不适合有多个通过 javaw 方式启动 java 程序的情况。
  2. set _des=E:/your/path/test-start.bat 表示如发现程序奔溃,自动运行的该bat文件。test-start.bat为启动jar程序的脚本。
  3. 检查周期当前为20s,如需更改检查周期,修改这2处地方:cscript //b //nologo %tmp%/delay.vbs 20000

 

b. 在计划任务中,设置“操作”中启动的脚本为刚刚新建的 bat 文件(test_listener.bat),大功告成。

 

 


如有表述不清楚的地方请让我知道,如果你对文章有任何疑问,欢迎来讨论~

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值