Регулировка Powershell Start-Jobs

У меня возникают проблемы с регулированием количества заданий, а также с «зависшими» или «неудачными» заданиями. Вот в основном то, что я пытаюсь сделать.

$allServers = Import-Csv "C:\temp\input.csv"
$job = $allServers | % {
    while (@(Get-Job -State Running).Count -ge 6) {
        Start-Sleep -Seconds 2
    }
    Start-Job -Name $_.computerName -ScriptBlock {
        param ($cpn,$dom)
        (DO QUERIES HERE)
        (OUTPUT TO OBJECT HERE)
    } -ArgumentList $_.computerName,$_.Domain 
}
$jobsdone = $job | Wait-Job | Receive-Job

Я хотел бы запустить 5 одновременных заданий, достаточно просто.

Проблема в том, что когда я запрашиваю сервер, который не отвечает, задание зависает, и сценарий никогда не заканчивается. Я пробовал добавлять...

Wait-Job -Name $_.computerName -Timeout 20

... над последней фигурной скобкой, но все, что нужно сделать, это эффективно ограничить параллелизм одним потоком, пока не пройдет 20 секунд, а затем отказаться от зависшего задания для выполнения других заданий. Весь сценарий все еще не заканчивается в этом экземпляре.

Этот код отлично работает без регулирования и ожидания задания, пока я не получаю не отвечающий сервер.


person Acerbity    schedule 08.05.2014    source источник


Ответы (1)


Внутри цикла while проверьте продолжительность выполнения задания. Если это больше, чем определенный вами тайм-аут, остановите это задание, например:

while (@(Get-Job -State Running).Count -ge 6) {
    $now = Get-Date
    foreach ($job in @(Get-Job -State Running)) {
        if ($now - (Get-Job -Id $job.id).PSBeginTime -gt [TimeSpan]::FromMinutes(2)) {
            Stop-Job $job
        }
    }
    Start-Sleep -sec 2
}

Вы можете проверить это запись в блоге команды PowerShell о том, как регулировать задания с помощью очереди.

person Keith Hill    schedule 09.05.2014