我有一个Powershell代码-有几个脚本块。
每个脚本块都是一项工作,我在while($true)
部分中启动这些工作。
问题在于工作持续时间不同,一项工作运行约1分钟,其他工作运行7分钟。
我想连续运行这些作业,当然,我要等到作业结束后再开始新的作业。
我不想等到最长的工作结束,而是开始一份较短的新工作。
例如,如果“ job1”在1分钟内完成,但是“ job2”需要10分钟,那么我想在“ job2”过程中启动10个“ job1”。
您是否知道我该如何做到?
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
}
答案 0 :(得分:0)
使用您当前的代码,一种可能性是仅在前一个任务完成时用几条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