的Splunk:“净停止Splunk的”只适用*有时*
我试图与厨师管理的Splunk和跨越的一个问题跑采用厨师以编程方式启动时/停止/重启Splunkforwarder服务:的Splunk:“净停止Splunk的”只适用*有时*
The request did not respond to the start or control request in a timely fashion. - ControlService: The service did not respond to the start or control request in a timely fashion.
一旦厨师运行失败,我可以用net start splunkforwarder
开始服务。
,我决定尝试通过重新启动在PowerShell中手动去(停止/启动)过程,现在当我尝试用net stop splunkfowarder
停止服务,我得到一个错误:
The service is not responding to the control function.
Somtimes停止服务工作,但很少。在这一点上,我不知道发生了什么,因为我不习惯在Windows(或Splunk)上工作,我不确定厨师的错误和net stop splunkforwarder
错误是否有关。
我也发现如果我直接通过C:\Program Files\SplunkUniversalForwarder\bin\splunk.exe
中的可执行文件与splunk进行交互,那么一切正常。我可以cd
到那个目录,并运行./splunk restart
没有问题。
任何人都知道发生了什么事情或对下一步的故障排除提供建议?
这属于ServerFault。
但是,
停止与net.exe
服务实际上做了两两件事:
- 发送停止命令的服务。
- 等待一段时间(30秒或60秒,IIRC)以查看服务是否已停止。如果有,报告成功。否则,错误。
我的猜测是net.exe stop splunk
正在打到net.exe
有时使用的任何超时。
你可以做的反而是:
sc.exe stop splunk
的sc.exe
命令将只执行步骤1.它发出停止命令,并立即返回。 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一样。
如果您手动获取相同的错误,这不太可能与厨师有关。去除标签。 – coderanger
'net stop splunkforwarder'在PowerShell中没有经过它,这将是'Get-Service'和'Restart-Service' cmdlet。 (并不是说如果Splunk没有响应服务控制请求,而是有'-Force'参数可用,那么这些行为会有所不同。 – TessellatingHeckler
这实际上不是一个编程问题,而是一个关于为什么Splunk不响应服务停止命令的问题(向Splunk报告它们 - 它们应该能够确定哪个线程阻止了进程转储,或者一系列过程转储)。我有另一个类似的问题服务,我使用powershell脚本来停止服务('stop-service'),然后休眠一下,然后检查进程是否正在运行。如果进程仍在运行,我使用'stop-process'来杀死它,然后使用'start-service'来重新启动它。 –