7

バックグラウンド ジョブ (で始まる) の時間を計り、数秒start-job後にタイムアウトさせたいと考えています。xただし、個別のジョブごとに実行時間を追跡するのは難しいと思います (約 400 のジョブを実行しています)。

ジョブをタイムアウトして X 秒以内でfailedない場合に設定する方法があればいいのにと思いますが、タイムアウト パラメータが見つかりません。completed

ジョブの個々の実行時間を追跡するにはどうすればよいでしょうか?

各ジョブの開始時刻とジョブ ID を使用してハッシュテーブルを作成し、running状態を確認して手動でタイムアウトを実行できると思いますが、それは「車輪の発明」のように聞こえます。何か案は?

編集 このトピックに関する実りある議論と素晴らしいインスピレーションをありがとうございました!

4

4 に答える 4

7

タイマーのハッシュ テーブルを使用できます。

 $jobtimer = @{}

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

各ジョブの実行時間は $jobtimer[$job].elapsed になります。

于 2012-03-18T18:23:04.403 に答える
4

実行中のジョブのリストを調べて、タイムアウトの仕様を超えて実行されたジョブを停止するだけです。

$timeout = [タイムスパン]::FromMinutes(1)
$now = 取得日
取得ジョブ | Where {$_.State -eq 'Running' -and
                 (($now - $_.PSBeginTime) -gt $timeout)} | ストップジョブ

ところで、ジョブオブジェクトには、デフォルトのフォーマットが示すよりも多くのプロパティがあります。

3 > $ジョブ | フロリダ *


状態 : 実行中
HasMoreData : 真
ステータスメッセージ :
場所: ローカルホスト
コマンド:スタートスリープ -sec 30
JobStateInfo : 実行中
完了: System.Threading.ManualResetEvent
インスタンス ID : de370ea8-763b-4f3b-ba0e-d45f402c8bc4
ID : 3
名前 : Job3
子ジョブ: {Job4}
PSBeginTime : 2012 年 3 月 18 日 11:07:20 AM
PSEndTime :
PSJobType : バックグラウンド ジョブ
出力: {}
エラー : {}
進捗 : {}
詳細: {}
デバッグ: {}
警告 : {}
于 2012-03-18T17:15:47.233 に答える
2

次のタイムアウト オプションを指定できますWait-Job

-タイムアウト

各バックグラウンド ジョブの最大待機時間を秒単位で決定します。デフォルトの -1 は、ジョブの実行時間に関係なく、ジョブが完了するまで待機します。Start-Job コマンドではなく、Wait-Job コマンドを送信すると、タイミングが開始されます。

この時間を超えると、ジョブがまだ実行中であっても、待機が終了し、コマンド プロンプトが返されます。エラーメッセージは表示されません。

コード例を次に示します。

この部分は、いくつかのテスト ジョブを作成するだけです。

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

変数$timedOutJobsには、タイムアウトになったジョブが含まれます。その後、それらを再起動するか、何を持っているかを確認できます。

$jobs | Wait-Job -Timeout 10 
$timedOutJobs = Get-Job | ? {$_.State -eq 'Running'} | Stop-Job -PassThru
于 2012-03-18T09:24:50.907 に答える