的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没有问题。

任何人都知道发生了什么事情或对下一步的故障排除提供建议?

+0

如果您手动获取相同的错误,这不太可能与厨师有关。去除标签。 – coderanger

+0

'net stop splunkforwarder'在PowerShell中没有经过它,这将是'Get-Service'和'Restart-Service' cmdlet。 (并不是说如果Splunk没有响应服务控制请求,而是有'-Force'参数可用,那么这些行为会有所不同。 – TessellatingHeckler

+1

这实际上不是一个编程问题,而是一个关于为什么Splunk不响应服务停止命令的问题(向Splunk报告它们 - 它们应该能够确定哪个线程阻止了进程转储,或者一系列过程转储)。我有另一个类似的问题服务,我使用powershell脚本来停止服务('stop-service'),然后休眠一下,然后检查进程是否正在运行。如果进程仍在运行,我使用'stop-process'来杀死它,然后使用'start-service'来重新启动它。 –

这属于ServerFault。

但是,

停止与net.exe服务实际上做了两两件事:

  1. 发送停止命令的服务。
  2. 等待一段时间(30秒或60秒,IIRC)以查看服务是否已停止。如果有,报告成功。否则,错误。

我的猜测是net.exe stop splunk正在打到net.exe有时使用的任何超时。

你可以做的反而是:

sc.exe stop splunk 

sc.exe命令将只执行步骤1.它发出停止命令,并立即返回。 PowerShell cmdlet Stop-Service将执行相同的操作,IIRC。请注意,net.exesc.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-ServiceStop-Service不远程工作时特别有用,但WMI一样。