2017-07-19 45 views
1

我寫一個PowerShell腳本,讓Logstash到了一定的時間運行,然後通過進程ID停止程序。下面是代碼的基本版本:Powershell的停止過程中不殺生Logstash

$logstashFilepath = "C:\Users\emckenzie\Downloads\logstash-5.3.2\logstash-5.3.2\bin\logstash.bat" 
$logstashArguments = "-f C:\users\emckenzie\Downloads\logstash-5.3.2\logstash-5.3.2\test_loader.conf" 

$logstashprocess = Start-Process -FilePath $logstashFilepath -ArgumentList $logstashArguments -PassThru 
$logstashid = $logstashprocess.Id 

Write-Host $logstashid 

Start-Sleep -s 60 

Stop-Process $logstashid 

在這種情況下,測試只Logstash從標準輸入寫入到標準輸出。當我運行此程序時,輸出如下所示:

17120 
Stop-Process : Cannot find a process with the process identifier 17120. 
At C:\Users\emckenzie\Documents\Loaders\testLoader.ps1:13 char:13 
+ Stop-Process <<<< $logstashid 
+ CategoryInfo   : ObjectNotFound: (17120:Int32) [Stop-Process], ProcessCommandException 
+ FullyQualifiedErrorId : NoProcessFoundForGivenId,Microsoft.PowerShell.Commands.StopProcessCommand 

這是Logstash或Powershell中的問題嗎?

任何幫助將不勝感激!

+0

看起來像Logstash正在啓動另一個進程。您應該能夠使用任務管理器或更好的SysInternals Process Explorer來見證這一點。如果事實證明這是你可以開始可能的Logstash情況下,稍等片刻,然後由它的名字抓住新的進程ID,如果它是一致的。 –

+0

感謝您的迴應!我想通了,我需要什麼程序停止Logstash(Java和JRuby的),但更多的閱讀,我不認爲這是一個好主意,去解決,而不讓它安全地停止殺害logstash後。存在數據丟失的風險,Elasticsearch也依賴於Java和JRuby。必須有一種官方的方式來做到這一點。 – emckenzie

回答

1

我結束了使用NSSM開始Logstash作爲一個服務,而不是和我通過PowerShell的控制NSSM。

# You must configure testlogstash using the GUI NSSM provides 
$logstashFilepath = "C:\Users\emckenzie\Downloads\nssm-2.24\nssm- 
2.24\win64\nssm.exe" 
$start = "start testlogstash" 
$stop = "stop testlogstash" 

$logstashprocess = Start-Process -FilePath $logstashFilepath -ArgumentList 
$start -PassThru 

Start-Sleep -s 60 

Start-Process -FilePath $logstashFilepath -ArgumentList $stop 
0

閱讀原始文章的評論後,我相信有你的解決方案。如果您知道程序運行需要保持運行直到作業完成:

$logstashprocess = Start-Process -FilePath $logstashFilepath -ArgumentList $logstashArguments -PassThru 
$logstashid = $logstashprocess.Id 

$Global:IsRunning = $false 

Do { 
    $process = Get-Process -processname "NameOfProcessHere" 
    If ($process){ 
     $IsRunning = $true 
    }else{ 
     $IsRunning = $false 
    } 
} While ($IsRunning -eq $true) 

Stop-Process -processname "$logstashid" 

讓我知道這是否有幫助,或者如果我不理解問題。

+0

請參閱問題是,關閉的步驟多於停止該過程的步驟。 https://www.elastic.co/guide/en/logstash/current/shutdown.html#_what_happens_during_a_controlled_shutdown 個人而言,我不認爲這是可能的,除非有一個命令的Windows關閉Logstash安全降落除了按Ctrl^C – emckenzie

+0

啊,我在閱讀那篇文章的鏈接後明白你的意思。我認爲你是正確的,如果它被迫關閉,沒有可能丟失重要數據的方法來做到這一點。 – cet51