使用Procrun安装的Windows服务可以在//TS模式下运行,但无法作为Windows服务启动,提示"已启动然后停止"。

13

我通过运行以下命令将标准可执行的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事件日志中也没有输出(Windows 7 64位)。 我该怎么做才能尝试找出为什么这个服务无法运行的原因?


你是以“本地用户”还是管理员用户身份运行服务? - checketts
它被设置为其他服务使用的默认的“本地系统帐户”。我尝试了其他帐户,但都没有成功。 - 11101101b
4个回答

5

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

经过多个小时的测试和分析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//My Service"

像他的情况一样,服务已正确安装并正常显示,但无法启动。 我通过在注册表中更改服务的ImagePath值数据设置来解决了这个问题,使其与命令的//RS//My Service部分具有相同的更改。 因此,注册表值在其数据设置中具有以下内容:

"//RS//My Service"

一切似乎都没有任何问题。

感谢您的跟进,@Suzanne。这可能会有用。 - 11101101b

1
这个服务器因为任务完成而被服务停止和启动,所以会自动停止。如果你在其中运行了长时间的逻辑,它就不会停止。

-1

我遇到了同样的问题...在我的本地机器上一切正常,但在服务器上出现了相同的问题 => 问题是工作路径未设置。希望这能帮助到某些人...愿原力与你同在

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接