2017-07-19 7 views
1

Logstashを一定時間実行してプロセスIDでプログラムを停止できるようにするPowerShellスクリプトを作成しています。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だけstdoutに標準入力からの書き込みこのテストケースには:ここでは、コードの基本的なバージョンがあります。このプログラムを実行すると、出力は次のようになります。

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でCtrl + C以外のLogstashを安全に終了するコマンドがない限り、それは可能ではないと思います – emckenzie

+0

ああ、私はあなたがそのリンクの記事を読んだ後に意味するものを参照してください。私はあなたが正しいことだと思うのは、これを行う方法がなくなる可能性があります。 – cet51

関連する問題