prunsrv.exe服务无法启动

时间:2013-03-21 08:58:10

标签: java apache-commons procrun

我正在尝试使用prunsrv.exe为应用程序安装和启动服务

我可以安装服务,但服务不会启动并给我一个错误

enter image description here

以下是用于使用prunsrv.exe安装服务的配置

set SERVICE_NAME=TestService

REM Service log configuration
set PR_LOGPREFIX=%SERVICE_NAME%
set PR_LOGPATH=D:\setups\Commons_Daemon\commons-daemon-1.0.14-bin-windows\logs
set PR_STDOUTPUT=auto
set PR_STDERROR=auto
set PR_LOGLEVEL=INFO

REM Path to java installation
set PR_JVM=C:\Program Files\Java\jre1.6.0_04\bin\client\jvm.dll
set PR_CLASSPATH=D:\setups\Commons_Daemon\commons-daemon-1.0.14-bin-windows\temp.jar;

REM Startup configuration
set PR_STARTUP=auto
set PR_STARTMODE=java
set PR_STARTCLASS=Trys.AppLauncher
set PR_STARTMETHOD=start

REM Shutdown configuration
set PR_STOPMODE=java
set PR_STOPCLASS=Trys.AppLauncher
set PR_STOPMETHOD=stop

REM JVM configuration
set PR_JVMMS=64
set PR_JVMMX=128
set PR_JVMSS=4000

REM Install service
prunsrv.exe //IS//%SERVICE_NAME%

将上述配置打包到批处理文件中以执行安装服务

也没有生成日志文件,因为我甚至无法调试。

请告诉我哪里出错了

9 个答案:

答案 0 :(得分:14)

一个可能的问题是使用了错误的prunsvr.exe。对于64位Java安装,使用amd64/prunsvr.exe,对于32位java安装,请在commons-deamon-xxx-bin-windows.zip文件中使用/prunsvr.exe

答案 1 :(得分:6)

这可能是很多事情。首先检查日志。默认值为...

  

%SYSTEMROOT%\ System32下\ LogFiles文件\阿帕奇

从那里你应该能够得到更具体的错误。例如。类路径,Java路径或其他一些选项无效。

答案 2 :(得分:4)

如果从服务管理器而不是命令行启动服务,则需要在注册表中设置CLASSPATH,JAVA_OPTS等。来自here

基本服务定义在注册表项下维护:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<ServiceName>

其他参数存储在注册表中:

HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\ProcRun 2.0\<ServiceName>\Parameters

在64位Windows上,procrun始终使用32位注册表视图来存储配置。这意味着参数将存储在:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Apache Software Foundation\ProcRun 2.0\<ServiceName>

答案 3 :(得分:4)

出现此错误的原因是我没有将prunsrv.exe重命名为TestService.exe。同样,Prunmgr.exe必须是TestServicew.exe。

重要的是重命名这些文件。

答案 4 :(得分:3)

我能够在本地计算机上运行该服务,但是在运行Windows 2012R2的VM上遇到了同样的错误。

问题是由两个原因造成的:

  1. 对jvm.dll的引用
  2. 在VM上,我使用JDK安装而不是简单的JRE,JAVA_HOME指向JDK bin文件夹。我不得不从&#34; auto&#34;更改-Jvm参数到位于JRE子文件夹中的实际jvm.dll文件。

    1. amd64版本的prunsrv.exe
    2. 尽管我更改了-Jvm设置,但服务仍然在启动时显示错误。我还必须使用amd64版本的prunsrv.exe来解决问题。

答案 5 :(得分:2)

万一有人觉得有帮助。 我有同样的问题“传递给系统调用的数据区域太小”。这是因为程序在StartMode = jvm中找不到jvm.dll。

解决方案:全部取决于您的StartMode。 1)如果“--StartMode”是jvm,你必须指定“--jvm”参数作为jvm.dll的路径 2)如果“--StartMode”是java或exe,则将“--jvm”参数设置为auto(您的程序将作为单独的procces命名为java.exe启动)

答案 6 :(得分:2)

我的笔记本电脑出现了同样的问题,但它正在使用其他具有相同配置功能的笔记本电脑。

我已查看%SystemRoot%\System32\LogFiles\Apache\commons-daemon.log。我发现以下错误缺少图像文件

然后我发现我们需要在所有参数上加上双引号。 在您的示例中,如果您尝试

  

pushd %CD%

请尝试以下操作。

  

"prunsrv.exe" //IS//%SERVICE_NAME%   --Startup="%PR_STARTUP%"   --Jvm="%PR_JVM%"   --Classpath="%PR_CLASSPATH%"   --StartMode="jvm"   --StopMode="jvm"   --StartClass="%PR_STARTCLASS%"   --StartMethod="%PR_STARTMETHOD%"   --StopClass="%PR_STOPCLASS%"   --StopMethod="%PR_STOPMETHOD%"

示例示例 http://www.eclipse.org/jetty/documentation/current/startup-windows-service.html

答案 7 :(得分:1)

只是将它与我​​的设置脚本进行比较,我看到的唯一直接的事情是你应该让你的内存设置看起来像

REM JVM configuration
set PR_JVMMS=64m 
set PR_JVMMX=128m
set PR_JVMSS=128m

顺便说一下,JRE 1.6.0_04有点过时了......

HTH 陀螺

答案 8 :(得分:1)

我有同样的错误,但我所要做的就是以管理员身份运行脚本(在Windows Server 2012上)...显然,Windows 2012上的权限系统已经改变了:ex。在Windows Server 2008上没有发生此错误(相同的脚本)。