2016-09-06 98 views
2

我試圖與廚師管理的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'來重新啓動它。 –

回答

3

這屬於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一樣。