about_Remote_Jobs
간단한 설명
원격 컴퓨터에서 백그라운드 작업을 실행하는 방법을 설명합니다.
자세한 설명
PowerShell은 작업을 통해 명령 및 스크립트를 동시에 실행합니다. 동시성을 지원하기 위해 PowerShell에서 제공하는 세 가지 작업 유형이 있습니다.
RemoteJob
- 명령 및 스크립트는 원격 세션에서 실행됩니다.BackgroundJob
- 명령 및 스크립트는 로컬 컴퓨터에서 별도의 프로세스로 실행됩니다. 자세한 내용은 about_Jobs 참조하세요.PSTaskJob
또는ThreadJob
- 명령 및 스크립트는 로컬 컴퓨터의 동일한 프로세스 내에서 별도의 스레드에서 실행됩니다. 자세한 내용은 about_Thread_Jobs 참조하세요.
원격으로, 별도의 컴퓨터 또는 별도의 프로세스에서 스크립트를 실행하면 격리가 매우 깁니다. 원격 작업에서 발생하는 오류는 다른 실행 중인 작업 또는 작업을 시작한 부모 세션에 영향을 주지 않습니다. 그러나 원격 계층은 개체 serialization을 포함하여 오버헤드를 추가합니다. 모든 개체는 부모 세션과 원격(작업) 세션 간에 전달될 때 직렬화되고 역직렬화됩니다. 대규모 복합 데이터 개체의 직렬화는 많은 양의 컴퓨팅 및 메모리 리소스를 사용하고 네트워크를 통해 대량의 데이터를 전송할 수 있습니다.
Important
작업을 만든 부모 세션도 작업 상태를 모니터링하고 파이프라인 데이터를 수집합니다. 작업이 완료된 상태에 도달하면 작업 자식 프로세스가 부모 프로세스에 의해 종료됩니다. 부모 세션이 종료되면 실행 중인 모든 자식 작업이 자식 프로세스와 함께 종료됩니다.
이 상황을 해결하는 방법에는 두 가지가 있습니다.
- 연결이 끊긴 세션에서 실행되는 작업을 만드는 데 사용합니다
Invoke-Command
. 이 문서의 분리된 프로세스 섹션을 참조하세요. - 작업 대신 새 프로세스를 만드는 데 사용합니다
Start-Process
. 자세한 내용은 Start-Process를 참조하세요.
원격 작업
세 가지 방법을 사용하여 원격 컴퓨터에서 작업을 실행할 수 있습니다.
원격 컴퓨터에서 대화형 세션을 시작합니다. 그런 다음 대화형 세션에서 작업을 시작합니다. 프로시저는 로컬 작업 실행과 동일하지만 모든 작업은 원격 컴퓨터에서 수행됩니다.
로컬 컴퓨터에 결과를 반환하는 원격 컴퓨터에서 작업을 실행합니다. 작업 결과를 수집하고 로컬 컴퓨터의 중앙 위치에 유지하려는 경우 이 메서드를 사용합니다.
원격 컴퓨터에서 결과를 유지하는 원격 컴퓨터에서 작업을 실행합니다. 작업 데이터가 원래 컴퓨터에서 더 안전하게 유지 관리되는 경우 이 메서드를 사용합니다.
대화형 세션에서 작업 시작
원격 컴퓨터로 대화형 세션을 시작한 다음 대화형 세션 중에 작업을 시작할 수 있습니다. 대화형 세션 에 대한 자세한 내용은 about_Remote 참조 Enter-PSSession
하세요.
대화형 세션에서 작업을 시작하는 절차는 로컬 컴퓨터에서 백그라운드 작업을 시작하는 절차와 거의 동일합니다. 그러나 모든 작업은 로컬 컴퓨터가 아닌 원격 컴퓨터에서 발생합니다.
cmdlet을
Enter-PSSession
사용하여 원격 컴퓨터로 대화형 세션을 시작합니다. ComputerName 매개 변수Enter-PSSession
를 사용하여 대화형 세션에 대한 임시 연결을 설정할 수 있습니다. 또는 Session 매개 변수를 사용하여 PowerShell 세션(PSSession)에서 대화형 세션을 실행할 수 있습니다.다음 명령은 Server01 컴퓨터에서 대화형 세션을 시작합니다.
C:\PS> Enter-PSSession -computername Server01
명령 프롬프트가 변경되어 이제 Server01 컴퓨터에 연결되어 있음을 표시합니다.
Server01\C:>
세션에서 원격 작업을 시작하려면 cmdlet을
Start-Job
사용합니다. 다음 명령은 Server01 컴퓨터의 Windows PowerShell 이벤트 로그에서 이벤트를 가져오는 원격 작업을 실행합니다. cmdlet은Start-Job
작업을 나타내는 개체를 반환합니다.이 명령은 작업 개체를 변수에
$job
저장합니다.Server01\C:> $job = Start-Job -scriptblock { Get-Eventlog "Windows PowerShell" }
작업이 실행되는 동안 대화형 세션을 사용하여 다른 작업을 비롯한 다른 명령을 실행할 수 있습니다. 그러나 작업이 완료될 때까지 대화형 세션을 열어 두어야 합니다. 세션을 종료하면 작업이 중단되고 결과가 손실됩니다.
작업이 완료되었는지 확인하려면 변수 값을
$job
표시하거나 cmdlet을Get-Job
사용하여 작업을 가져옵니다. 다음 명령은 cmdlet을Get-Job
사용하여 작업을 표시합니다.Server01\C:> Get-Job $job SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 1 Job1 Complete True localhost Get-Eventlog "Windows...
출력은
Get-Job
작업이 시작되고 동일한 컴퓨터(이 경우 Server01)에서 실행 중이므로 "localhost" 컴퓨터에서 작업이 실행 중임을 보여 줍니다.작업의 결과를 얻으려면 cmdlet을
Receive-Job
사용합니다. 대화형 세션에서 결과를 표시하거나 원격 컴퓨터의 파일에 저장할 수 있습니다. 다음 명령은 $job 변수에서 작업의 결과를 가져옵니다. 이 명령은 리디렉션 연산자(>
)를 사용하여 Server01 컴퓨터의 PsLog.txt 파일에 작업 결과를 저장합니다.Server01\C:> Receive-Job $job > c:\logs\PsLog.txt
대화형 세션을 종료하려면 cmdlet을
Exit-PSSession
사용합니다. 명령 프롬프트가 변경되어 로컬 컴퓨터의 원래 세션으로 돌아왔다는 것을 표시합니다.Server01\C:> Exit-PSSession C:\PS>
언제든지 Server01 컴퓨터에서 파일의
PsLog.txt
내용을 보려면 다른 대화형 세션을 시작하거나 원격 명령을 실행합니다. 이 유형의 명령은 여러 명령을 사용하여 파일의 데이터를 조사하고 관리하려는 경우 PSSession(영구 연결)에서PsLog.txt
실행하는 것이 가장 좋습니다. PSSessions에 대한 자세한 내용은 about_PSSessions 참조하세요.다음 명령은 cmdlet을 사용하여
New-PSSession
Server01 컴퓨터에 연결된 PSSession을 만들고, cmdlet을 사용하여Invoke-Command
PSSession에서 명령을 실행Get-Content
하여 파일의 내용을 봅니다.$s = New-PSSession -computername Server01 Invoke-Command -session $s -scriptblock { Get-Content c:\logs\pslog.txt}
로컬 컴퓨터에 결과를 반환하는 원격 작업 시작(AsJob)
명령 결과를 로컬 컴퓨터에 반환하는 원격 컴퓨터에서 작업을 시작하려면 cmdlet과 같은 cmdlet의 AsJob 매개 변수를 Invoke-Command
사용합니다.
AsJob 매개 변수를 사용하면 작업이 원격 컴퓨터에서 실행되는 경우에도 작업 개체가 로컬 컴퓨터에 실제로 만들어집니다. 작업이 완료되면 결과가 로컬 컴퓨터로 반환됩니다.
작업 명사(작업 cmdlet)가 포함된 cmdlet을 사용하여 cmdlet에서 만든 모든 작업을 관리할 수 있습니다. AsJob 매개 변수가 있는 대부분의 cmdlet은 PowerShell 원격을 사용하지 않으므로 원격으로 구성되지 않고 원격 요구 사항을 충족하지 않는 컴퓨터에서도 사용할 수 있습니다.
다음 명령은 AsJob 매개 변수
Invoke-Command
를 사용하여 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 컴퓨터에서 작업이 실행되었음을 나타냅니다.
cmdlet의
Invoke-Command
AsJob 매개 변수를 사용하여 시작된 작업을 관리하려면 Job cmdlet을 사용합니다. 원격 작업을 나타내는 작업 개체가 로컬 컴퓨터에 있으므로 원격 명령을 실행하여 작업을 관리할 필요가 없습니다.작업이 완료되었는지 여부를 확인하려면 명령을 사용합니다
Get-Job
. 다음 명령은 현재 세션에서 시작된 모든 작업을 가져옵니다.Get-Job
현재 세션에서 원격 작업이 시작되었으므로 로컬
Get-Job
명령이 작업을 가져옵니다. 작업 개체의 상태 속성은 명령이 성공적으로 완료되었음을 보여줍니다.SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 1 Job1 Completed True Server01 Get-Eventlog system
작업의 결과를 얻으려면 cmdlet을
Receive-Job
사용합니다. 작업 결과가 작업 개체가 있는 컴퓨터에 자동으로 반환되므로 로컬Receive-Job
명령을 사용하여 결과를 가져올 수 있습니다.다음 명령은 cmdlet을
Receive-Job
사용하여 작업 결과를 가져옵니다. 세션 ID를 사용하여 작업을 식별합니다. 이 명령은 작업 결과를 $results 변수에 저장합니다. 결과를 파일로 리디렉션할 수도 있습니다.$results = Receive-Job -id 1
원격 컴퓨터에서 결과를 유지하는 원격 작업 시작
원격 컴퓨터에서 명령 결과를 유지하는 원격 컴퓨터에서 작업을 시작하려면 cmdlet을 Invoke-Command
사용하여 원격 컴퓨터에서 Start-Job
명령을 실행합니다. 이 메서드를 사용하여 여러 컴퓨터에서 작업을 실행할 수 있습니다.
명령을 원격으로 Start-Job
실행하면 작업 개체가 원격 컴퓨터에 만들어지고 작업 결과가 원격 컴퓨터에서 유지됩니다.
작업의 관점에서 모든 작업은 로컬입니다. 원격 컴퓨터에서 로컬 작업을 관리하기 위해 명령을 원격으로 실행하기만 하면 됩니다.
cmdlet을
Invoke-Command
사용하여 원격 컴퓨터에서Start-Job
명령을 실행합니다.이 명령에는 PSSession(영구 연결)이 필요합니다. ComputerName 매개 변수
Invoke-Command
를 사용하여 임시 연결을Invoke-Command
설정하는 경우 작업 개체가 반환될 때 명령이 완료된 것으로 간주됩니다. 결과적으로 임시 연결이 닫히고 작업이 취소됩니다.다음 명령은 cmdlet을
New-PSSession
사용하여 Server01 컴퓨터에 연결된 PSSession을 만듭니다. 이 명령은 PSSession을 변수에$s
저장합니다.$s = New-PSSession -computername Server01
다음 명령은 cmdlet을
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 컴퓨터에서 만들어지고 작업이 동일한 컴퓨터에서 실행되므로 로컬 백그라운드 작업으로 간주됩니다.
원격 작업을 관리하려면 작업 cmdlet을 사용합니다. 작업 개체가 원격 컴퓨터에 있으므로 원격 명령을 실행하여 작업 결과를 가져오기, 중지, 대기 또는 검색해야 합니다.
작업이 완료되었는지 확인하려면 명령을 사용하여
Invoke-Command
Server01 컴퓨터에 연결된 PSSession에서 명령을 실행Get-Job
합니다.Invoke-Command -session $s -scriptblock {Get-Job}
이 명령은 작업 개체를 반환합니다. 작업 개체의 상태 속성은 명령이 성공적으로 완료되었음을 보여줍니다.
SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 2 Job2 Completed True LocalHost Get-Eventlog system
작업의 결과를 얻으려면 cmdlet을
Invoke-Command
사용하여 Server01 컴퓨터에 연결된 PSSession에서 명령을 실행Receive-Job
합니다.다음 명령은 cmdlet을
Receive-Job
사용하여 작업 결과를 가져옵니다. 세션 ID를 사용하여 작업을 식별합니다. 이 명령은 작업 결과를 변수에$results
저장합니다. Keep 매개 변수Receive-Job
를 사용하여 결과를 원격 컴퓨터의 작업 캐시에 유지합니다.$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 }
분리된 프로세스로 실행하는 방법
앞서 언급했듯이 부모 세션이 종료되면 실행 중인 모든 자식 작업이 자식 프로세스와 함께 종료됩니다. 로컬 컴퓨터에서 원격을 사용하여 현재 PowerShell 세션에 연결되지 않은 작업을 실행할 수 있습니다.
로컬 머신에서 새 PowerShell 세션을 만듭니다. 이 세션에서 작업을 시작하는 데 사용합니다 Invoke-Command
. Invoke-Command
를 사용하면 원격 세션의 연결을 끊고 부모 세션을 종료할 수 있습니다. 나중에 새 PowerShell 세션을 시작하고 이전에 연결이 끊긴 세션에 연결하여 작업 모니터링을 다시 시작할 수 있습니다. 그러나 원래 PowerShell 세션으로 반환된 모든 데이터는 해당 세션이 종료될 때 손실됩니다. 연결 끊기 후에 생성된 새 데이터 개체만 다시 연결할 때 반환됩니다.
# Create remote session on local machine
PS> $session = New-PSSession -cn localhost
# Start remote job
PS> $job = Invoke-Command -Session $session -ScriptBlock { 1..60 | % { sleep 1; "Output $_" } } -AsJob
PS> $job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 RemoteJob Running True localhost 1..60 | % { sleep 1; ...
# Disconnect the job session
PS> Disconnect-PSSession $session
Id Name Transport ComputerName ComputerType State ConfigurationName Availability
-- ---- --------- ------------ ------------ ----- ----------------- ------------
1 Runspace1 WSMan localhost RemoteMachine Disconnected Microsoft.PowerShell None
PS> $job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 RemoteJob Disconnected True localhost 1..60 | % { sleep 1;
# Reconnect the session to a new job object
PS> $jobNew = Receive-PSSession -Session $session -OutTarget Job
PS> $job | Wait-Job | Receive-Job
Output 9
Output 10
Output 11
...
이 예제에서는 작업이 여전히 부모 PowerShell 세션에 연결됩니다.
그러나 부모 세션은 실행된 원래 PowerShell 세션 Invoke-Command
이 아닙니다.
참고 항목
PowerShell