0

我想使用(以避免打开整个日志)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}

任何建议如何解决这个问题?

4

1 回答 1

0

从不同的作业同时写入相同的输出文件会产生竞争条件,除非您有一个调度程序来协调写入访问。此外,如果您想从 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 之前的属性访问中不会自动展开数组。

于 2016-03-08T12:36:12.063 回答