Splunk:' net stop splunk'只有*有时*

时间:2016-09-06 18:27:19

标签: powershell windows-server-2012 devops splunk

我尝试使用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

任何人都知道发生了什么,或者有关于故障排除的后续步骤的建议?

1 个答案:

答案 0 :(得分:3)

这确实属于ServerFault。

然而

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

  1. 将停止命令发送到服务。
  2. 等待一段时间(30秒或60秒,IIRC)以查看服务是否已停止。如果有,报告成功。否则,错误。
  3. 我的猜测net.exe stop splunk正在达到net.exe有时会使用的任何超时。

    你能做的是:

    sc.exe stop splunk
    

    sc.exe命令只执行第1步。它发送stop命令并立即返回。 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会这样做。