我尝试使用Chef管理Splunk,并在使用Chef以编程方式启动/停止/重新启动Splunkforwarder服务时遇到问题:
请求未响应a中的启动或控制请求 及时时尚。 - ControlService:该服务没有响应 及时启动或控制请求。
Chef运行失败后,我可以使用net start splunkforwarder
启动服务。
我决定尝试在Powershell中手动完成重启(停止/启动)过程,现在当我尝试使用net stop splunkfowarder
停止服务时出现错误:
服务未响应控制功能。
Somtimes 停止服务,但很少。此时我不知道发生了什么,因为我不习惯在Windows上工作(或使用Splunk),并且不确定Chef的错误和net stop splunkforwarder
错误是否是相关。
我还发现,如果我直接通过C:\Program Files\SplunkUniversalForwarder\bin\splunk.exe
中的可执行文件与splunk进行交互,那么一切正常。我可以cd
到该目录并毫无问题地运行./splunk restart
。
任何人都知道发生了什么,或者有关于故障排除的后续步骤的建议?
答案 0 :(得分:3)
这确实属于ServerFault。
然而
使用net.exe
停止服务实际上做了两件事:
我的猜测net.exe stop splunk
正在达到net.exe
有时会使用的任何超时。
你能做的是:
sc.exe stop splunk
sc.exe
命令只执行第1步。它发送stop命令并立即返回。 PowerShell cmdlet Stop-Service
将执行相同的操作,IIRC。请注意,net.exe
和sc.exe
是不是本机PowerShell命令或cmdlet。它们是标准程序。
您也可以这样做等待,比如5秒:
$svc = Get-Service splunk;
$svc.Stop();
$svc.WaitForStatus('Stopped','00:00:05');
然后你可以看看$svc.Status
看看它在做什么。
或者你可以告诉它无限期地等待:
$svc = Get-Service splunk;
$svc.Stop();
$svc.WaitForStatus('Stopped');
Get-Service
返回System.ServiceProcess.ServiceController类型的对象。您可以查看$svc | Get-Member
或$svc | Format-List
以获取有关该对象的更多信息以及您可以使用它做些什么。
如果您希望脚本能够终止进程,则可能需要获取PID。这有点复杂,因为上面的类没有因某些愚蠢的原因而暴露PID。典型的方法是WMI:
$wmisvc_pid = (Get-WmiObject -Class Win32_Service -Filter "Name = 'splunk'").ProcessId;
Stop-Process $wmisvc_pid -Force;
WMI还公开了它自己的Start()
和Stop()
方法,并且特别有用,因为Start-Service
和Stop-Service
不能远程工作,但WMI会这样做。