Несколько заданий в одном коде Powershell с разной продолжительностью - PullRequest
0 голосов
/ 06 июня 2019

У меня есть код Powershell - с несколькими скриптовыми блоками. Каждый блок сценария является заданием, и я запускаю задания в разделе while($true). Проблема в том, что продолжительность работы различна, одна работа выполняется ~ 1 минута, другая - 7 минут. Я хочу выполнять задания непрерывно и, конечно же, я хочу дождаться окончания задания, прежде чем начинать новое.
Я хотел бы не ждать окончания самой длинной работы, а начать новую с более короткой работы. Например, если «job1» заканчивается через 1 минуту, а «job2» занимает 10 минут, я хотел бы запустить 10 «job1» во время процесса «job2».

У вас есть представление о том, как я могу этого достичь?

while($true) {

   Start-job -name somejob1 -scriptblock $block1...

   Start-job -name somejob2 -scriptblock $block2...

   ...

   Start-job -name somejobX -scriptblock $blockX..


   Get-job | Wait-job | Remove job

   Start-sleep -s 120

}

1 Ответ

0 голосов
/ 06 июня 2019

Используя ваш текущий код, одна возможность состоит в том, чтобы только повторить задание, когда предыдущий завершается с несколькими if утверждениями.

while($true) {

if ((Get-Job).Name -notcontains "startjob1") {
    Start-Job -Name "startjob1" -scriptblock $block1
}

if ((Get-Job).Name -notcontains "startjob2") {
    Start-Job -Name "startjob2" -scriptblock $block2
}

if ((Get-Job).Name -notcontains "startjob3") {
    Start-Job -Name "startjob3" -scriptblock $block3
}

Start-Sleep -Seconds 120

Get-Job -State "Completed" | Remove-Job

}

Пояснение:

Это создаст бесконечный цикл запуска заданий, которые не перечислены в выводе Get-Job. После запуска каждого задания и оценки его состояния мы ждем 120 секунд, прежде чем проверять статусы задания. На этом этапе успешно завершенные задания удаляются. Эта часть может быть изменена для проверки других значений состояния с помощью | Where-Object перед передачей в Remove-Job, поскольку могут быть случаи, когда задания не выполняются, и вы все равно хотите выполнить их повторно.

Как правило, вы можете использовать Wait-Job для ожидания завершения задания или для периода ожидания, в зависимости от того, что наступит раньше. Если вы знаете больше о том, какие задания выполняются с наименьшим сроком действия, или о более подходящем периоде ожидания, измените значение времени ожидания или измените порядок команд Start-Job.

Start-job -name somejob1 -scriptblock $block1...
Wait-Job -name somejob1 -timeout 60

Start-job -name somejob2 -scriptblock $block1...
Wait-Job -name somejob2 -timeout 60
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...