管理后台作业的运行时间。如果x秒后仍未完成,则会超时,

Sun*_*une 5 powershell timeout start-job

我想对后台作业(以开头start-job)进行计时,并在x几秒钟后将其超时。但是,我很难跟踪每个单独作业的运行时间(我正在运行aprox 400作业)。

我希望有一种方法来超时工作,并将其设置为failed如果不是completed在X秒,但我觉得没有超时参数。

什么是跟踪作业的各个运行时间的好方法?

我想我可以用每个作业的开始时间和作业ID创建一个哈希表,并对照running状态进行检查并进行手动超时,但这听起来有点像“发明轮子”。有任何想法吗?

编辑 谢谢大家在这个主题上进行了富有成果的讨论和启发!

And*_*ndi 5

您可以指定超时选项Wait-Job

-暂停

确定每个后台作业的最长等待时间(以秒为单位)。默认值 -1,无论作业运行多长时间,都会等待作业完成。计时从您提交 Wait-Job 命令而非 Start-Job 命令时开始。

如果超过此时间,即使作业仍在运行,等待也会结束并返回命令提示符。不显示错误消息。

这是一些示例代码:

这部分只是做了一些测试工作:

Remove-Job -Name *
$jobs = @()
1..10 | % {
    $jobs += Start-Job -ScriptBlock {
        Start-Sleep -Seconds (Get-Random -Minimum 5 -Maximum 20)
    }
}
Run Code Online (Sandbox Code Playgroud)

该变量$timedOutJobs包含超时的作业。然后你可以重新启动它们或者你有什么。

$jobs | Wait-Job -Timeout 10 
$timedOutJobs = Get-Job | ? {$_.State -eq 'Running'} | Stop-Job -PassThru
Run Code Online (Sandbox Code Playgroud)


mjo*_*nor 5

您可以使用计时器的哈希表:

 $jobtimer = @{}

 foreach ($job in $jobs){
   start-job -name $job -ScriptBlock {scriptblock commands}
   $jobtimer[$job] = [System.Diagnostics.Stopwatch]::startnew()
   }
Run Code Online (Sandbox Code Playgroud)

每个作业的运行时间将在$ jobtimer [$ job] .elapsed中