随 Procrun 一起安装的 Windows 服务在 //TS 模式下工作,但不会作为 Windows 服务启动,说它“已启动,然后停止”

我通过运行以下命令安装了一个标准的可执行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 服务已启动,然后停止。如果某些服务未被其他服务或程序使用,它们会自动停止。

当我尝试以这种方式启动服务时,我的应用程序日志文件中没有输出。窗口的事件日志(Windows 7 64 位)中也没有输出。我该怎么做才能尝试找出为什么此服务不会运行?


答案 1

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

经过几个小时的测试和拉开Tomcat并复制它的引导过程,我的问题的修复最终是Apache Commons Daemon(Procrun)在Windows服务名称中有空格时无法正常工作。

当服务名称中有空格时,它似乎可以正确地向 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"

答案 2

我想提供一些关于上面所说的“11101101b”的其他信息。(这是我的第一篇文章,所以请温柔一点!

我能够通过将他的命令的 //IS//MyService 部分更改为以下内容来正确安装服务,并在服务名称中使用空格,我怀疑这也是他所做的。(如果我的假设不正确,我很抱歉。请注意,左双引号位于字符串的开头,而不是服务名称的开头。

“//IS//我的服务”

与他的情况一样,服务安装正确且看起来正确,但无法启动。我能够通过更改注册表中服务的 ImagePath 值数据设置来解决此问题,以便对命令的 //RS//My Service 部分进行相同的更改。因此,注册表值在其数据设置中具有以下内容:

“//RS//我的服务”

一切似乎都在工作,没有任何问题。


推荐