我正在编写一个powershell脚本,允许Logstash运行一段时间,然后按进程ID停止程序。以下是代码的基本版本:
$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仅从stdin写入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 :(得分:1)
我最终使用NSSM来启动Logstash作为服务,我通过Powershell控制NSSM。
Join/Where
答案 1 :(得分: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"
如果这有用,或者我不理解这个问题,请告诉我。