about_Jobs
간단한 설명
PowerShell 백그라운드 작업이 현재 세션과 상호 작용하지 않고 백그라운드에서 명령 또는 식을 실행하는 방법에 대한 정보를 제공합니다.
자세한 설명
PowerShell은 작업을 통해 명령 및 스크립트를 동시에 실행합니다. 동시성을 지원하기 위해 PowerShell에서 제공하는 세 가지 작업 유형이 있습니다.
RemoteJob
- 명령 및 스크립트는 원격 세션에서 실행됩니다. 자세한 내용은 about_Remote_Jobs 참조하세요.BackgroundJob
- 명령 및 스크립트는 로컬 컴퓨터에서 별도의 프로세스로 실행됩니다.PSTaskJob
또는ThreadJob
- 명령 및 스크립트는 로컬 컴퓨터의 동일한 프로세스 내에서 별도의 스레드에서 실행됩니다. 자세한 내용은 about_Thread_Jobs 참조하세요.
원격으로, 별도의 컴퓨터 또는 별도의 프로세스에서 스크립트를 실행하면 격리가 매우 깁니다. 원격 작업에서 발생하는 오류는 다른 실행 중인 작업 또는 작업을 시작한 부모 세션에 영향을 주지 않습니다. 그러나 원격 계층은 개체 serialization을 포함하여 오버헤드를 추가합니다. 모든 개체는 부모 세션과 원격(작업) 세션 간에 전달되므로 직렬화되고 역직렬화됩니다. 대규모 복합 데이터 개체의 직렬화는 많은 양의 컴퓨팅 및 메모리 리소스를 사용하고 네트워크를 통해 대량의 데이터를 전송할 수 있습니다.
스레드 기반 작업은 다른 스레드에서 동일한 프로세스에서 실행되기 때문에 원격 및 백그라운드 작업만큼 강력하지 않습니다. 한 작업에 프로세스와 충돌하는 심각한 오류가 있으면 프로세스의 다른 모든 작업이 종료됩니다.
그러나 스레드 기반 작업에는 오버헤드가 적습니다. 원격 계층 또는 serialization을 사용하지 않습니다. 결과 개체는 현재 세션에서 라이브 개체에 대한 참조로 반환됩니다. 이 오버헤드가 없으면 스레드 기반 작업이 더 빠르게 실행되고 다른 작업 유형보다 적은 리소스를 사용합니다.
Important
작업을 만든 부모 세션도 작업 상태를 모니터링하고 파이프라인 데이터를 수집합니다. 작업이 완료된 상태에 도달하면 작업 자식 프로세스가 부모 프로세스에 의해 종료됩니다. 부모 세션이 종료되면 실행 중인 모든 자식 작업이 자식 프로세스와 함께 종료됩니다.
이 상황을 해결하는 방법에는 두 가지가 있습니다.
- 연결이 끊긴 세션에서 실행되는 작업을 만드는 데 사용합니다
Invoke-Command
. 자세한 내용은 about_Remote_Jobs 참조하세요. - 작업 대신 새 프로세스를 만드는 데 사용합니다
Start-Process
. 자세한 내용은 Start-Process를 참조하세요.
작업 cmdlet
Start-Job
- 로컬 컴퓨터에서 백그라운드 작업을 시작합니다.Get-Job
- 현재 세션에서 시작된 백그라운드 작업을 가져옵니다.Receive-Job
- 백그라운드 작업의 결과를 가져옵니다.Stop-Job
- 백그라운드 작업을 중지합니다.Wait-Job
- 하나 또는 모든 작업이 완료될 때까지 명령 프롬프트를 표시하지 않습니다.Remove-Job
- 백그라운드 작업을 삭제합니다.Invoke-Command
- AsJob 매개 변수는 원격 컴퓨터에서 백그라운드 작업을 만듭니다. 를 포함하여Start-Job
모든 작업 명령을 원격으로 실행하는 데 사용할Invoke-Command
수 있습니다.
로컬 컴퓨터에서 작업을 시작하는 방법
로컬 컴퓨터에서 백그라운드 작업을 시작하려면 cmdlet을 Start-Job
사용합니다.
명령을 작성 Start-Job
하려면 작업이 중괄호({}
)로 실행되는 명령을 묶습니다. ScriptBlock 매개 변수를 사용하여 명령을 지정합니다.
다음 명령은 로컬 컴퓨터에서 명령을 실행하는 Get-Process
백그라운드 작업을 시작합니다.
Start-Job -ScriptBlock {Get-Process}
백그라운드 작업을 시작하면 작업이 완료되는 데 시간이 연장되더라도 명령 프롬프트가 즉시 반환됩니다. 작업이 실행되는 동안 중단 없이 세션에서 작업을 계속할 수 있습니다.
이 Start-Job
명령은 작업을 나타내는 개체를 반환합니다. 작업 개체에는 작업에 대한 유용한 정보가 포함되어 있지만 작업 결과는 포함되지 않습니다.
작업 개체를 변수에 저장한 다음 다른 작업 cmdlet과 함께 사용하여 백그라운드 작업을 관리할 수 있습니다. 다음 명령은 작업 개체를 시작하고 결과 작업 개체를 변수에 $job
저장합니다.
$job = Start-Job -ScriptBlock {Get-Process}
PowerShell 6.0부터 파이프라인 끝에 있는 백그라운드 연산자(&
)를 사용하여 백그라운드 작업을 시작할 수 있습니다. 자세한 내용은 백그라운드 연산자(background operator)를 참조하세요.
백그라운드 연산자를 사용하는 것은 이전 예제에서 cmdlet을 Start-Job
사용하는 것과 기능적으로 동일합니다.
$job = Get-Process &
작업 개체 가져오기
cmdlet은 Get-Job
현재 세션에서 시작된 백그라운드 작업을 나타내는 개체를 반환합니다. 매개 변수가 Get-Job
없으면 현재 세션에서 시작된 모든 작업을 반환합니다.
Get-Job
작업 개체에는 작업이 완료되었는지 여부를 나타내는 작업의 상태가 포함됩니다. 완료된 작업에 완료 또는 실패 상태가 있습니다. 작업이 차단되거나 실행 중일 수도 있습니다.
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Complete True localhost Get-Process
작업 개체를 변수에 저장하고 이를 사용하여 이후 명령에서 작업을 나타낼 수 있습니다. 다음 명령은 ID가 1인 작업을 가져오고 변수에 $job
저장합니다.
$job = Get-Job -Id 1
작업 결과 가져오기
백그라운드 작업을 실행하면 결과가 즉시 표시되지 않습니다. 백그라운드 작업의 결과를 얻으려면 cmdlet을 Receive-Job
사용합니다.
다음 예제에서 cmdlet은 Receive-Job
변수에서 작업 개체 $job
를 사용하여 작업의 결과를 가져옵니다.
Receive-Job -Job $job
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
668 7 2672 6168 104 32.26 488 csrss
...
작업 결과를 변수에 저장할 수 있습니다. 다음 명령은 변수의 작업 $job
결과를 변수에 $results
저장합니다.
$results = Receive-Job -Job $job
부분 작업 결과 가져오기 및 유지
cmdlet은 Receive-Job
백그라운드 작업의 결과를 가져옵니다. 작업이 완료되면 Receive-Job
모든 작업 결과를 가져옵니다. 작업이 계속 실행 Receive-Job
중인 경우 지금까지 생성된 결과를 가져옵니다. 명령을 다시 실행 Receive-Job
하여 나머지 결과를 가져올 수 있습니다.
기본적으로 Receive-Job
작업 결과가 저장되는 캐시에서 결과를 삭제합니다. 다시 실행하면 첫 번째 실행 Receive-Job
후에 도착한 새 결과만 표시됩니다.
다음 명령은 작업이 완료되기 전에 실행된 명령의 Receive-Job
결과를 보여 줍니다.
C:\PS> Receive-Job -Job $job
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
C:\PS> Receive-Job -Job $job
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
68 3 2632 664 29 0.36 1388 ccmsetup
749 22 21468 19940 203 122.13 3644 communicator
905 7 2980 2628 34 197.97 424 csrss
1121 25 28408 32940 174 430.14 3048 explorer
Keep 매개 변수를 사용하여 반환되는 작업 결과를 삭제하지 못하도록 합니다Receive-Job
. 다음 명령은 아직 완료되지 않은 작업에 Keep 매개 변수를 사용하는 효과를 보여 줍니다.
C:\PS> Receive-Job -Job $job -Keep
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
C:\PS> Receive-Job -Job $job -Keep
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
68 3 2632 664 29 0.36 1388 ccmsetup
749 22 21468 19940 203 122.13 3644 communicator
905 7 2980 2628 34 197.97 424 csrss
1121 25 28408 32940 174 430.14 3048 explorer
결과 대기 중
완료하는 데 시간이 오래 걸리는 명령을 실행하는 경우 작업 개체의 속성을 사용하여 작업이 완료되는 시기를 확인할 수 있습니다. 다음 명령은 개체를 Get-Job
사용하여 현재 세션의 모든 백그라운드 작업을 가져옵니다.
Get-Job
결과는 테이블에 표시됩니다. 작업 상태가 상태 열에 나타납니다.
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Complete True localhost Get-Process
2 Job2 BackgroundJob Running True localhost Get-EventLog -Log ...
3 Job3 BackgroundJob Complete True localhost dir -Path C:\* -Re...
이 경우 상태 속성은 작업 2가 여전히 실행 중임을 표시합니다. cmdlet을 Receive-Job
사용하여 작업 결과를 가져오는 경우 결과가 불완전합니다. cmdlet을 Receive-Job
반복적으로 사용하여 모든 결과를 가져올 수 있습니다. 상태 속성을 사용하여 작업이 완료된 시기를 확인합니다.
cmdlet의 Wait 매개 변수를 Receive-Job
사용할 수도 있습니다. 이 매개 변수를 사용하는 경우 cmdlet은 작업이 완료되고 모든 결과를 사용할 수 있을 때까지 명령 프롬프트를 반환하지 않습니다.
cmdlet을 Wait-Job
사용하여 작업의 결과 또는 전부를 기다릴 수도 있습니다. Wait-Job
를 사용하면 하나 이상의 특정 작업 또는 모든 작업을 기다릴 수 있습니다.
다음 명령은 cmdlet을 Wait-Job
사용하여 ID가 10인 작업을 기다립니다.
Wait-Job -ID 10
따라서 작업이 완료될 때까지 PowerShell 프롬프트가 표시되지 않습니다.
미리 정해진 기간 동안 기다릴 수도 있습니다. 이 명령은 Timeout 매개 변수를 사용하여 대기 시간을 120초로 제한합니다. 시간이 만료되면 명령 프롬프트가 반환되지만 작업은 백그라운드에서 계속 실행됩니다.
Wait-Job -ID 10 -Timeout 120
작업 중지
백그라운드 작업을 중지하려면 cmdlet을 Stop-Job
사용합니다. 다음 명령은 시스템 이벤트 로그의 모든 항목을 가져오는 작업을 시작합니다. 작업 개체를 변수에 $job
저장합니다.
$job = Start-Job -ScriptBlock {Get-EventLog -Log System}
다음 명령은 작업을 중지합니다. 파이프라인 연산자(|
)를 사용하여 변수Stop-Job
의 작업을 .에 $job
보냅니다.
$job | Stop-Job
작업 삭제
백그라운드 작업을 삭제하려면 cmdlet을 Remove-Job
사용합니다. 다음 명령은 변수의 작업을 $job
삭제합니다.
Remove-Job -Job $job
실패한 작업 조사
여러 가지 이유로 작업이 실패할 수 있습니다. 작업 개체에는 오류의 원인에 대한 정보가 포함된 Reason 속성이 포함되어 있습니다.
다음 예제에서는 필요한 자격 증명 없이 작업을 시작합니다.
$job = Start-Job -ScriptBlock {New-Item -Path HKLM:\Software\MyCompany}
Get-Job $job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Failed False localhost New-Item -Path HKLM:...
Reason 속성을 검사하여 작업이 실패하게 한 오류를 찾습니다.
$job.ChildJobs[0].JobStateInfo.Reason
이 경우 원격 컴퓨터에서 명령을 실행하기 위해 명시적 자격 증명이 필요했기 때문에 작업이 실패했습니다. Reason 속성에는 다음 메시지가 포함됩니다.
"액세스가 거부되었습니다."라는 오류 메시지와 함께 원격 서버에 연결하지 못했습니다.
참고 항목
PowerShell