リモート ジョブについて
概要
リモート コンピューターでバックグラウンド ジョブを実行する方法について説明します。
詳細説明
バックグラウンド ジョブは、現在のセッションと対話せずに非同期的に実行されるコマンドです。 コマンド プロンプトはすぐに戻り、ジョブの実行中にセッションを引き続き使用できます。
既定では、バックグラウンド ジョブはローカル コンピューターで実行されます。 ただし、リモート コンピューターでバックグラウンド ジョブを実行するには、いくつかの異なる手順を使用できます。
このトピックでは、リモート コンピューターでバックグラウンド ジョブを実行する方法について説明します。 ローカル コンピューターでバックグラウンド ジョブを実行する方法については、「 about_Jobs」を参照してください。 バックグラウンド ジョブの詳細については、「 about_Job_Details」を参照してください。
リモート バックグラウンド ジョブ
リモート コンピューターでバックグラウンド ジョブを実行するには、3 つの異なる方法を使用します。
リモート コンピューターとの対話型セッションを開始し、対話型セッションでジョブを開始します。 プロシージャはローカル ジョブの実行と同じですが、すべてのアクションはリモート コンピューターで実行されます。
結果をローカル コンピューターに返すリモート コンピューターでバックグラウンド ジョブを実行します。 バックグラウンド ジョブの結果を収集し、ローカル コンピューター上の中央の場所に保持する場合は、このメソッドを使用します。
リモート コンピューター上で結果を保持するリモート コンピューターでバックグラウンド ジョブを実行します。 この方法は、ジョブ データが元のコンピューターでより安全に維持される場合に使用します。
対話型セッションでバックグラウンド ジョブを開始する
リモート コンピューターとの対話型セッションを開始し、対話型セッション中にバックグラウンド ジョブを開始できます。 対話型セッションの詳細については、「about_Remote」および「Enter-PSSession」を参照してください。
対話型セッションでバックグラウンド ジョブを開始する手順は、ローカル コンピューターでバックグラウンド ジョブを開始する手順とほぼ同じです。 ただし、すべての操作は、ローカル コンピューターではなくリモート コンピューターで行われます。
手順 1: ENTER-PSSESSION
Enter-PSSession コマンドレットを使用して、リモート コンピューターとの対話型セッションを開始します。 Enter-PSSession の ComputerName パラメーターを使用して、対話型セッションの一時的な接続を確立できます。 または、Session パラメーターを使用して、Windows PowerShell セッション (PSSession) で対話型セッションを実行できます。
次のコマンドは、Server01 コンピューターで対話型セッションを開始します。
C:\PS> Enter-PSSession -computername Server01
コマンド プロンプトが変わり、Server01 コンピューターに接続されたことを示します。
Server01\C:>
手順 2: START-JOB
セッションでバックグラウンド ジョブを開始するには、Start-Job コマンドレットを使用します。
次のコマンドは、Server01 コンピューター上の Windows PowerShell イベント ログ内のイベントを取得するバックグラウンド ジョブを実行します。 Start-Job コマンドレットは、ジョブを表す オブジェクトを返します。
このコマンドは、ジョブ オブジェクトを $job 変数に保存します。
Server01\C:> $job = start-job -scriptblock {
get-eventlog "Windows PowerShell"
}
ジョブの実行中は、対話型セッションを使用して、他のバックグラウンド ジョブを含む他のコマンドを実行できます。 ただし、ジョブが完了するまで、対話型セッションを開いたままにする必要があります。 セッションを終了すると、ジョブは中断され、結果は失われます。
手順 3: GET-JOB
ジョブが完了したかどうかを確認するには、$job変数の値を表示するか、Get-Job コマンドレットを使用してジョブを取得します。 次のコマンドは、Get-Job コマンドレットを使用してジョブを表示します。
Server01\C:> get-job $job
SessionId Name State HasMoreData Location Command
--------- ---- ----- ----------- -------- -------
1 Job1 Complete True localhost get-eventlog "Windows...
Get-Job 出力には、ジョブが "localhost" コンピューターで実行されていることが示されています。これは、ジョブが開始され、同じコンピューター (この場合は Server01) で実行されているためです。
手順 4: RECEIVE-JOB
ジョブの結果を取得するには、Receive-Job コマンドレットを使用します。 結果は対話型セッションで表示することも、リモート コンピューター上のファイルに保存することもできます。 次のコマンドは、$job変数内のジョブの結果を取得します。 このコマンドでは、リダイレクト演算子 (>) を使用して、Server01 コンピューター上の PsLog.txt ファイルにジョブの結果を保存します。
Server01\C:> receive-job $job > c:\logs\PsLog.txt
手順 5: EXIT-PSSESSION
対話型セッションを終了するには、Exit-PSSession コマンドレットを使用します。 コマンド プロンプトが変更され、ローカル コンピューター上の元のセッションに戻っていることを示します。
Server01\C:> Exit-PSSession
C:\PS>
手順 6: INVOKE-COMMAND: GET-CONTENT
Server01 コンピューター上の PsLog.txt ファイルの内容をいつでも表示するには、別の対話型セッションを開始するか、リモート コマンドを実行します。 この種類のコマンドは、複数のコマンドを使用して PsLog.txt ファイル内のデータを調査および管理する場合に備えて、PSSession (永続的な接続) で最適に実行されます。 PSSessions の詳細については、「about_PSSessions」を参照してください。
次のコマンドは、New-PSSession コマンドレットを使用して Server01 コンピューターに接続されている PSSession を作成し、Invoke-Command コマンドレットを使用して PSSession で Get-Content コマンドを実行してファイルの内容を表示します。
$s = new-pssession -computername Server01
invoke-command -session $s -scriptblock {
get-content c:\logs\pslog.txt}
結果をローカル コンピューターに返すリモート ジョブを開始する (ASJOB)
コマンドの結果をローカル コンピューターに返すリモート コンピューターでバックグラウンド ジョブを開始するには、Invoke-Command コマンドレットなどのコマンドレットの AsJob パラメーターを使用します。
AsJob パラメーターを使用すると、ジョブがリモート コンピューターで実行されている場合でも、ジョブ オブジェクトはローカル コンピューター上に実際に作成されます。 ジョブが完了すると、結果がローカル コンピューターに返されます。
Job 名詞 (Job コマンドレット) を含むコマンドレットを使用して、任意のコマンドレットによって作成されたすべてのジョブを管理できます。 AsJob パラメーターを持つコマンドレットの多くは、リモート処理Windows PowerShell使用しないため、リモート処理用に構成されておらず、リモート処理の要件を満たしていないコンピューターでも使用できます。
手順 1: INVOKE-COMMAND -ASJOB
次のコマンドでは、Invoke-Command の AsJob パラメーターを使用して、Server01 コンピューターでバックグラウンド ジョブを開始します。 このジョブは、システム ログのイベントを取得する Get-Eventlog コマンドを実行します。 JobName パラメーターを使用して、ジョブに表示名を割り当てることができます。
invoke-command -computername Server01 -scriptblock {
get-eventlog system} -asjob
コマンドの結果は、次の出力例のようになります。
SessionId Name State HasMoreData Location Command
--------- ---- ----- ----------- -------- -------
1 Job1 Running True Server01 get-eventlog system
AsJob パラメーターを使用すると、Invoke-Command は、Start-Job が返すのと同じ種類のジョブ オブジェクトを返します。 ジョブ オブジェクトを変数に保存することも、Get-Job コマンドを使用してジョブを取得することもできます。
Location プロパティの値は、ジョブが Server01 コンピューターで実行されたことを示しています。
手順 2: GET-JOB
Invoke-Command コマンドレットの AsJob パラメーターを使用して開始されたジョブを管理するには、Job コマンドレットを使用します。 リモート ジョブを表すジョブ オブジェクトはローカル コンピューター上にあるため、ジョブを管理するためにリモート コマンドを実行する必要はありません。
ジョブが完了したかどうかを確認するには、Get-Job コマンドを使用します。 次のコマンドは、現在のセッションで開始されたすべてのジョブを取得します。
get-job
リモート ジョブは現在のセッションで開始されたため、ローカル Get-Job コマンドによってジョブが取得されます。 ジョブ オブジェクトの State プロパティは、コマンドが正常に完了したことを示します。
SessionId Name State HasMoreData Location Command
--------- ---- ----- ----------- -------- -------
1 Job1 Completed True Server01 get-eventlog system
手順 3: RECEIVE-JOB
ジョブの結果を取得するには、Receive-Job コマンドレットを使用します。 ジョブの結果はジョブ オブジェクトが存在するコンピューターに自動的に返されるため、ローカル Receive-Job コマンドを使用して結果を取得できます。
次のコマンドでは、Receive-Job コマンドレットを使用してジョブの結果を取得します。 セッション ID を使用してジョブを識別します。 このコマンドは、ジョブの結果を $results 変数に保存します。 結果をファイルにリダイレクトすることもできます。
$results = receive-job -id 1
リモート コンピューターで結果を保持するリモート ジョブを開始する
リモート コンピューターでコマンドの結果を保持するリモート コンピューターでバックグラウンド ジョブを開始するには、Invoke-Command コマンドレットを使用して、リモート コンピューターで Start-Job コマンドを実行します。 このメソッドを使用すると、複数のコンピューターでバックグラウンド ジョブを実行できます。
Start-Job コマンドをリモートで実行すると、ジョブ オブジェクトがリモート コンピューターに作成され、ジョブの結果がリモート コンピューターに保持されます。 ジョブの観点から見ると、すべての操作はローカルです。 リモート コンピューターでローカル ジョブを管理するためのコマンドをリモートで実行しているだけです。
手順 1: INVOKE-COMMAND START-JOB
リモート コンピューターで Start-Job コマンドを実行するには、Invoke-Command コマンドレットを使用します。
このコマンドには PSSession (永続的な接続) が必要です。 Invoke-Command の ComputerName パラメーターを使用して一時的な接続を確立すると、ジョブ オブジェクトが返されるときに、Invoke-Command コマンドが完了したと見なされます。 その結果、一時的な接続が閉じられ、ジョブが取り消されます。
次のコマンドでは、New-PSSession コマンドレットを使用して、Server01 コンピューターに接続されている PSSession を作成します。 このコマンドは、PSSession を $s 変数に保存します。
$s = new-pssession -computername Server01
次のコマンドでは、Invoke-Command コマンドレットを使用して、PSSession で Start-Job コマンドを実行します。 Start-Job コマンドと Get-Eventlog コマンドは中かっこで囲まれています。
invoke-command -session $s -scriptblock {
start-job -scriptblock {get-eventlog system}}
結果は次の出力例のようになります。
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
2 Job2 Running True Localhost get-eventlog system
Start-Job コマンドをリモートで実行すると、Invoke-Command は、Start-Job が返すのと同じ種類のジョブ オブジェクトを返します。 ジョブ オブジェクトを変数に保存することも、Get-Job コマンドを使用してジョブを取得することもできます。
Location プロパティの値は、ジョブが Server01 コンピューターで実行された場合でも、"LocalHost" と呼ばれるローカル コンピューターでジョブが実行されたことを示しています。 ジョブ オブジェクトは Server01 コンピューター上に作成され、ジョブは同じコンピューター上で実行されるため、ローカル バックグラウンド ジョブと見なされます。
手順 2: INVOKE-COMMAND GET-JOB
リモート バックグラウンド ジョブを管理するには、Job コマンドレットを使用します。 ジョブ オブジェクトはリモート コンピューター上にあるため、ジョブの結果を取得、停止、待機、または取得するには、リモート コマンドを実行する必要があります。
ジョブが完了したかどうかを確認するには、Invoke-Command コマンドを使用して、Server01 コンピューターに接続されている PSSession で Get-Job コマンドを実行します。
invoke-command -session $s -scriptblock {get-job}
このコマンドによって返されるのは、ジョブ オブジェクトです。 ジョブ オブジェクトの State プロパティは、コマンドが正常に完了したことを示します。
SessionId Name State HasMoreData Location Command
--------- ---- ----- ----------- -------- -------
2 Job2 Completed True LocalHost get-eventlog system
手順 3: INVOKE-COMMAND RECEIVE-JOB
ジョブの結果を取得するには、Invoke-Command コマンドレットを使用して、Server01 コンピューターに接続されている PSSession で Receive-Job コマンドを実行します。
次のコマンドでは、Receive-Job コマンドレットを使用してジョブの結果を取得します。 セッション ID を使用してジョブを識別します。 このコマンドは、ジョブの結果を $results 変数に保存します。 Receive-Job の Keep パラメーターを使用して、リモート コンピューター上のジョブ キャッシュに結果を保持します。
$results = invoke-command -session $s -scriptblock {
receive-job -sessionid 2 -keep}
また、ローカル コンピューターまたはリモート コンピューター上のファイルに結果をリダイレクトすることもできます。 次のコマンドは、リダイレクト演算子を使用して、結果を Server01 コンピューター上のファイルに保存します。
invoke-command -session $s -command {
receive-job -sessionid 2 > c:\logs\pslog.txt}