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 服务启动然后停止。如果某些服务没有被其他服务或程序使用,它们会自动停止。

当我尝试以这种方式启动服务时,我的应用程序的日志文件中没有输出。Window 的事件日志(Windows 7 64 位)中也没有输出。我可以做些什么来尝试找出为什么此服务无法运行?

4

4 回答 4

5

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

经过数小时的测试和拆解 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"
于 2012-05-25T14:14:21.323 回答
2

我想就上面所说的“11101101b”提供一些额外的信息。(这是我的第一篇文章,所以请温柔!)

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

“//IS//我的服务”

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

“//RS//我的服务”

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

于 2014-06-23T22:42:58.843 回答
1

此服务器启动和停止是因为该服务已完成任务,因此它会自动停止。如果你有一个长时间运行的逻辑,它就不会停止。

于 2015-04-03T13:49:27.903 回答
-1

我遇到了同样的问题......在我的本地机器下,在服务器上一切正常,同样的问题 => 问题是未设置工作路径。愿它的人……成为你的力量

在此处输入图像描述

于 2019-08-08T11:42:03.980 回答