作业意外退出
Job quits unexpectedly
我想使用 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 之前的 属性 访问时自动展开数组。
我想使用 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 之前的 属性 访问时自动展开数组。