java - 与 Procrun 一起安装的 Windows 服务在//TS 模式下工作,但不会作为 Windows 服务启动,提示它 "started and then stopped"

标签 java windows-services executable-jar procrun

我通过运行以下命令安装了一个标准的可执行 jar 文件作为 Windows 服务:

> prunsrv.exe //IS//"My Service" --Install="C:\path-to-prunsrv.exe" --Jvm=auto \
  --Startup=auto --StartMode=jvm --Classpath="C:\path-to-MyService.jar" \
  --StartClass=com.mydomain.MyService

我现在可以通过运行以下命令在控制台模式下正常运行我的程序(我使用的是 Java 1.6):

> prunsrv.exe //TS//"My Service"

当我尝试通过标准 Windows 服务界面启动服务时,我收到以下错误消息:

本地计算机上的 MyService 服务启动然后停止。某些服务如果未被其他服务或程序使用,则会自动停止。

当我尝试以这种方式启动服务时,应用程序的日志文件中没有输出。 Window 的事件日志(Windows 7 64 位)中也没有输出。我该怎么做才能弄清楚此服务无法运行的原因?

最佳答案

不要在服务名称中使用任何空格!

经过数小时的测试和拆解 Tomcat 并复制它的引导过程后,我的问题最终解决为当 Windows 服务名称中有空格时 Apache Commons Daemon (Procrun) 无法正常工作.

当服务名称中有空格时,它似乎可以正确安装并向 Windows 注册服务。 Windows 注册表条目甚至看起来都是正确的。该服务甚至可以在调试(也称为 TS 或控制台)模式下运行。但是,当运行时,作为由 Windows 启动的实际服务,如果服务安装时服务名称中带有空格,则它会失败。

我当然希望 Procrun 在失败时有某种类型的日志输出!良好的日志记录可以使调试此类问题变得轻而易举。

我确实需要在我的服务名称中包含多个单词,所以我用一个单词命名我的服务并使用“DisplayName”参数更改名称:

> prunsrv.exe //IS//MyService --Install="C:\path-to-prunsrv.exe" --Jvm=auto \
  --Startup=auto --StartMode=jvm --Classpath="C:\path-to-MyService.jar" \
  --StartClass=com.mydomain.MyService --DisplayName="My Service"

关于java - 与 Procrun 一起安装的 Windows 服务在//TS 模式下工作,但不会作为 Windows 服务启动,提示它 "started and then stopped",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10725890/

相关文章:

c# - 未处理的异常会使 WCF 服务崩溃?

Java:纠错码计算器

java - 使用struts2 mvc架构如何将Canvas图像存储到服务器

java - 正则表达式匹配 Java 中 & 周围的非空白

Java 11 SE 控制台输出

java - 可执行 .Jar 文件中的音乐无法播放

java - 使用命令提示符启动后台 java

java - @RequestParam 为空(Spring MVC)

c# - Windows 服务 + Windows 窗体应用程序。一个数据库。关于并发的建议

c# - 在 Windows 服务中持久化变量的公认方法是什么