5

Start-Jobコマンドレットと-FilePathパラメーターを使用して他の PowerShell スクリプトを呼び出す (継承した) PowerShell スクリプトがあります。たとえば、何もしないスクリプトがあります。

Start-Sleep -Seconds 86400

ジョブを介して呼び出すことができるもの:

PS> Start-Job -Name "Test Job" -FilePath ".\Wait-AllDay.ps1"

Id Name     PSJobTypeName State   HasMoreData Location  Command                        
-- ----     ------------- -----   ----------- --------  -------                        
2  Test Job BackgroundJob Running True        localhost Start-Sleep...

PS> Get-Job -Id 2

State         : Running
HasMoreData   : True
StatusMessage : 
Location      : localhost
Command       : Start-Sleep -Seconds (60*60*24)
JobStateInfo  : Running
Finished      : System.Threading.ManualResetEvent
InstanceId    : 0c0e2c32-cbc5-4d70-b7cb-28771626cf20
Id            : 2
Name          : Test Job
ChildJobs     : {Job3}
PSBeginTime   : 25/01/2016 15:06:22
PSEndTime     : 
PSJobTypeName : BackgroundJob

このジョブに関連付けられているプロセスを見つけるための簡単で信頼できる方法はありますか (追加のpowershell.exeになると思います)。明らかに、これは 1 つのジョブだけでテストするのは簡単ですが、サーバー上では、これらの多くを同時に実行する場合があります。

なぜ私はこれをしたい/知りたいのですか?

私は新しい役割を担っており、さまざまなスクリプトを実行する複数のスケジュールされたタスクを持つサーバーで作業しています。これらのいくつかは、私の前任者が Start-Job を使用して呼び出すことを選択した他のスクリプトを呼び出します。これはおそらく、実行時間が長く (数時間) かかる可能性があり、並行して動作することを望んでいたためです。時折、彼らは立ち往生しているように見え、私は彼らを殺したいと思っていますが、まだ健全なものを止める危険を冒したくありません.

近い将来、これらのスクリプトのいくつかを書き直し始める可能性が高いため、この道を歩み始めたので、ジョブとプロセスをどのように一致させるかについては、おそらく単純な好奇心です。

4

2 に答える 2

3

コマンドレットを使用する*-Jobことは、実際のプロセスをいじるよりも優れたアプローチである可能性があります。Get-Job既存のジョブを一覧表示するために使用します。

PS C:\> Get-Job

ID 名 PSJobTypeName 状態 HasMoreData 場所 コマンド
-- ---- ------------- ----- ----------- -------- -------
2 Job2 BackgroundJob Running False localhost Do-Some
4 Job4 BackgroundJob Completed True localhost Get-Other

このCommandプロパティは、ジョブが実行されている/実行されていたスクリプト ブロックの内容を保持します。

(Get-Job -Id 2).Command

このStateプロパティは、ジョブの現在の状態 (実行中、完了、失敗、ブロックなど) を示します。このHasMoreDataプロパティは、 経由でフェッチできる出力がジョブにあるかどうかを示しますReceive-Job

Receive-Job -Id 4

ジョブは で停止できStop-JobRemove-Job終了したジョブはジョブ リストから削除されます。

バックグラウンド ジョブの詳細については、こちらを参照してください。

于 2016-01-26T00:40:20.430 に答える
1

私が知る限り、「どのプロセスが各ジョブに対応しているかわかりますか」に対する答えはノーです。

ただし、ジョブに一致するプロセスがどのプロセスであるかについては、いくつかの手がかりがあるようです。

  1. 次のようなコマンドラインがあります。

    "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -Version 4.0 -s -NoLogo -NoProfile

  2. これらは、起動方法に応じて、別のpowershell.exeまたはpowershell_ise.exeプロセスの子プロセスです。親プロセスがタスク マネージャーまたはその他のスケジューリング エージェントによって呼び出される場合、プロセスのコマンド ラインにスクリプト名が表示される可能性が高く、これが役立つ場合があります。私の場合、スケジュールされた各タスクが ~4 個の powershell.exe バックグラウンド プロセスを生成していたため、これはあまり役に立ちませんでした。

  3. 各ジョブがいつ開始されたかの詳細がある場合 (コマンドレットを実行してジョブの詳細を返すことができれば簡単ですGet-Job)、タイムスタンプに基づいてジョブとプロセスを一致させることができるかもしれませんが、単純なテストでも正確な結果は得られませんでした。マッチ; ジョブとプロセスは、開始時に 1 ~ 2 秒離れていました。

それ以外に、各ジョブに関連付けられた実際のプロセスを特定するための有効な方法を見つけることができませんでした。

于 2016-02-01T22:23:56.963 に答える