SpringBoot jar注册为Windows服务后停止服务java进程残留如何解决
解决方案
问题根因
你当前配置的StartMode=exe是让prunsrv单独启动独立的java.exe子进程,prunsrv默认没有绑定子进程的生命周期,且配置的java模式停止逻辑没有正确触发SpringBoot进程退出,才会出现java进程残留。
修复方案
方案1(更推荐:完全避免独立java进程)
改用prunsrv的JVM模式运行,直接将JVM加载到prunsrv进程内部,不会额外生成独立java.exe进程,从根源解决残留问题。修改后配置如下:
set "CLASSPATH=D:\temp-1.0.0.jar" prunsrv.exe //IS//%SERVICE_NAME% ^ --Description "Myservice" ^ --DisplayName "%DISPLAYNAME%" ^ --Install "%EXECUTABLE%" ^ --LogPath "D:\MyService" ^ --Startup auto ^ --StdOutput auto ^ --StdError auto ^ --Classpath "%CLASSPATH%" ^ --Jvm "%JVM%" ^ --StartMethod main ^ --StopMethod stop ^ --StartMode jvm ^ --StopMode jvm ^ --StartPath "D:\MyService" ^ --StopPath "D:\MyService" ^ --StartClass com.darth.MyService ^ --StopClass com.darth.MyService ^ --StopParams stop ^ --JvmMs 1024 ^ --JvmMx 6144 ^ --StopTimeout 30
同时需要在你的com.darth.MyService启动类中补充静态stop方法,实现SpringBoot优雅退出:
package com.darth; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; @SpringBootApplication public class MyService { private static ConfigurableApplicationContext context; public static void main(String[] args) { context = SpringApplication.run(MyService.class, args); } // 新增stop方法供prunsrv调用 public static void stop() { SpringApplication.exit(context, () -> 0); } }
方案2(保留exe启动模式,强制杀残留进程)
如果需要保留独立java.exe启动的方式,修改停止配置让prunsrv停止时自动杀掉关联java进程:
set "CLASSPATH=D:\temp-1.0.0.jar" prunsrv.exe //IS//%SERVICE_NAME% ^ --Description "Myservice" ^ --DisplayName "%DISPLAYNAME%" ^ --Install "%EXECUTABLE%" ^ --LogPath "D:\MyService" ^ --Startup auto ^ --StdOutput auto ^ --StdError auto ^ --Classpath "%CLASSPATH%" ^ --Jvm "%JVM%" ^ --StartImage "%JAVA_HOME%\bin\java.exe" ^ --StartMethod main ^ --StartMode exe ^ --StopMode exe ^ --StartPath "D:\MyService" ^ --StopPath "D:\MyService" ^ --StartClass com.darth.MyService ^ --StopImage "C:\Windows\System32\taskkill.exe" ^ --StopParams "/f#/im#java.exe#/fi#COMMANDLINE eq *temp-1.0.0.jar*" ^ --StartParams -jar#%CLASSPATH% ^ --JvmMs 1024 ^ --JvmMx 6144 ^ --StopTimeout 10
该方案的StopParams会匹配命令行包含
temp-1.0.0.jar的java进程强制杀掉,不会误杀其他Java服务。
内容的提问来源于stack exchange,提问作者Darth
相关产品推荐
相关产品推荐

