Java net.exe为什么启动<;servicename>;服务启动时是否报告故障?
我有一个Java应用程序,它使用Apache守护进程服务安装程序将其注册为Windows服务。我正在使用Puppet运行一个exec{}块来注册该服务,然后链接一个服务{}块来启动该服务。Puppet使用“net.exe start”运行服务,但该命令报告错误,即使服务正确启动 在powershell shell中运行该命令的输出为: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
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包装器引起的
- 除了修改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