( 전체 로그를 열지 않도록)를 Start-Job
사용하여 둘 이상의 로그 파일을 동시에 모니터링 (꼬리)하는 데 사용 하고 싶습니다 .Get-Content file -Wait -Last 1
-Last 1
실행 gc $file -Last 1 -Wait
은 하나의 파일 만 테일링 할 수 있습니다. 그것을 마무리 Start-Job -Scriptblock
하면 즉시 작업이 종료됩니다.
나는 이런 것을 염두에두고 있었다.
Start-Job -Name srv1 -ScriptBlock {Get-Content "\\srv1\$log" -Wait -Last 1} | Select-String "matching some text only" | Out-File D:\autogrep.log}
Start-Job -Name srv2 -ScriptBlock {Get-Content "\\srv2\$log" -Wait -Last 1} | Select-String "matching some text only" | Out-File D:\autogrep.log}
Start-Job -Name srv3 -ScriptBlock {Get-Content "\\srv3\$log" -Wait -Last 1} | Select-String "matching some text only" | Out-File D:\autogrep.log}
Start-Job -Name srv4 -ScriptBlock {Get-Content "\\srv4\$log" -Wait -Last 1} | Select-String "matching some text only" | Out-File D:\autogrep.log}
Start-Job -Name srv5 -ScriptBlock {Get-Content "\\srv5\$log" -Wait -Last 1} | Select-String "matching some text only" | Out-File D:\autogrep.log}
이 문제를 해결하는 방법에 대한 제안이 있습니까?
쓰기 액세스를 조정하는 스케줄러가없는 경우 다른 작업에서 동일한 출력 파일에 동시에 쓰는 것은 경쟁 조건을 생성합니다. 또한 UNC 경로에서 로그를 읽으려면 경로를 \\server\share\file
.
다음과 같이 시도하십시오.
$servers = 'srv1', 'srv2', 'srv3', 'srv4', 'srv5'
$jobs = @()
$servers | ForEach-Object {
$jobs += Start-Job -Name $_ -ScriptBlock {
Param($server, $log)
Get-Content "\\$server\share\$log" -Wait -Last 1
} -ArgumentList $_, 'your.log'
}
while ($jobs.State -contains 'Running') {
$jobs | Where-Object { $_.hasMoreData } |
Receive-Job |
Select-String 'matching some text only' |
Out-File 'D:\autogrep.log' -Append
Start-Sleep -Milliseconds 100
}
당신은 여전히 사용하는 경우 PowerShell을 사용하면 교체해야 V2 것을 참고 $jobs.State
로 @($jobs | Select-Object -Expand State)
PowerShell을 v3으로 이전 속성 액세스에 자동으로 풀다 배열을하지 않기 때문에.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다