Java net.exe为什么启动<;servicename>;服务启动时是否报告故障?

Java net.exe为什么启动<;servicename>;服务启动时是否报告故障?,java,windows,service,puppet,Java,Windows,Service,Puppet,我有一个Java应用程序,它使用Apache守护进程服务安装程序将其注册为Windows服务。我正在使用Puppet运行一个exec{}块来注册该服务,然后链接一个服务{}块来启动该服务。Puppet使用“net.exe start”运行服务,但该命令报告错误,即使服务正确启动 在powershell shell中运行该命令的输出为: PS C:\ProgramData\PuppetLabs\puppet\etc\modules> net start myservice The myser

我有一个Java应用程序,它使用Apache守护进程服务安装程序将其注册为Windows服务。我正在使用Puppet运行一个exec{}块来注册该服务,然后链接一个服务{}块来启动该服务。Puppet使用“net.exe start”运行服务,但该命令报告错误,即使服务正确启动

在powershell shell中运行该命令的输出为:

PS C:\ProgramData\PuppetLabs\puppet\etc\modules> net start myservice
The myservice_descriptive_name service is starting.....
The myservice_descriptive_name service could not be started.

More help is available by typing NET HELPMSG 3523.
当我在运行此命令时刷新Windows服务面板时,我看到状态从:

空白字段->开始->开始


这是由apache包装器(在单独的shell中启动jvm)引起的问题还是其他副作用?而且,更重要的是,我能在仍然使用服务{}块的情况下在Puppet中解决这个问题吗?除了使用exec{}块之外,是否可以替换不存在相同问题的sc.exe?

原因是服务启动时间太长,无法与启动器正确通信


当您编写启动通信或DB连接的服务时,您必须与服务控制管理器(SCM)通信,以提供您正在启动的信息。在执行这种“我仍在启动消息”时,SCM可以根据需要等待任意时间启动。但许多将exe文件封装为服务的服务编写器或工具忽略了这一点,因此SCM返回“服务无法启动”。在Win32中,这是由函数处理的,您将在这里了解更多详细信息。

JPBlanc的回答解释了为什么net.exe在等待服务启动时超时,即使它最终启动了。您完全可以尝试将
net.exe
调用替换为
sc.exe
(服务控制)

我已经创建了一个票证来解决这个问题-


如果您发现等待时也没有超时,请评论和/或提交包含更改的请求。无论如何,最好使用比net.exe更好的工具。

按顺序回答问题:

  • net start
    命令报告失败,因为服务似乎已挂起

  • 是的,问题是由Apache包装器引起的

具体来说,包装器告诉Windows它将在两秒钟内到达第一个检查点。由于Java代码似乎无法实现检查点或更改等待提示,这意味着服务必须在两秒钟内启动,以符合Windows服务规范

(原则上,Windows有权在此时终止您的服务。据我所知,当前版本的Windows不会这样做,尽管它们可能会记录错误消息。)

  • 除了修改Puppet或(最好)Apache包装器之外,唯一明显的解决方法是确保服务立即“启动”,而不是等待初始化完成

这不太理想,因为这意味着如果Puppet确实无法初始化,服务将无法向Puppet提供反馈,但最糟糕的是,您建议使用
sc start
而不是
net start

net start
生成错误消息后,
sc query
会立即说明服务的状态吗?服务名称:myservice类型:10 WIN32\u OWN\u进程状态:2启动挂起(不可停止、不可暂停、忽略关机)WIN32退出代码:0(0x0)服务退出代码:0(0x0)检查点:0x0等待\u提示:0x7d0 PID:2284标志:PS C:\ProgramData\PuppetLabs\puppet\etc\modules>echo$?TrueOK,所以当
net.exe
放弃时,该服务实际上还没有启动。它曾经开始过吗?也就是说,
sc query
是否说过
RUNNING
而不是
START\u PENDING
?每次服务都会启动,sc.exe都会正确报告。啊。这就是等待提示(0x7D0=2000毫秒)。检查点为0,因此不会增加;net.exe实际上必须遵守检查点/等待提示系统。(我不知道!)。我想,您可以通过立即“启动”来解决这个问题。对不起,这并不能回答全部问题,即是否可以在puppet的服务{}实现中用sc.exe替换net.exe。它也没有真正回答net.exe报告由Windows管理的状态条件错误的原因。也就是说,如果Windows在stopped->starting->started之间更改服务的状态,那么在状态更改周期完成之前,它不应该抛出错误消息说服务无法启动。我认为这是一个错误,不管原因是什么。我也认为这是一个错误。请参阅我关于下一步的回答。谢谢你的询问!谢谢你打开车票。我将我打开的票证链接到它,因为你的票证更好地概括了改变行为的优点。顺便说一下,启动此服务只需不到5秒钟,这对于启动流程来说是合理的。ServiceRunner是一个成熟的apache项目,为我服务了多年。这个服务运行程序包装的我自己的应用程序是独立的,因此没有DB依赖项之类的东西。基本上,net.exe没有理由抛出错误。研究表明net.exe有一分钟的超时时间。我认为分析是错误的;net.exe没有问题。最可能的问题是服务本身没有正确地向Windows报告其状态。根据OP,
sc