about_Job_Details

간단한 설명

로컬 및 원격 컴퓨터의 백그라운드 작업에 대한 세부 정보를 제공합니다.

자세한 설명

이 항목에서는 백그라운드 작업의 개념을 설명하고 PowerShell에서 백그라운드 작업이 작동하는 방식에 대한 기술 정보를 제공합니다.

이 항목은 about_Jobs, about_Thread_Jobsabout_Remote_Jobs 항목을 보완합니다.

백그라운드 작업 정보

백그라운드 작업은 명령 또는 식을 비동기적으로 실행합니다. cmdlet, 함수, 스크립트 또는 다른 명령 기반 작업을 실행할 수 있습니다. 오랜 시간이 걸리는 명령을 실행하도록 설계되었지만 백그라운드에서 명령을 실행하는 데 사용할 수 있습니다.

동기 명령이 실행되면 명령이 완료될 때까지 PowerShell 명령 프롬프트가 표시되지 않습니다. 그러나 백그라운드 작업은 PowerShell 프롬프트를 표시하지 않습니다. 백그라운드 작업을 시작하는 명령은 작업 개체를 반환합니다. 백그라운드 작업이 실행되는 동안 다른 작업을 수행할 수 있도록 프롬프트가 즉시 반환됩니다.

그러나 백그라운드 작업을 시작할 때 작업이 매우 빠르게 실행되더라도 즉시 결과를 얻지 못합니다. 반환되는 작업 개체에는 작업에 대한 유용한 정보가 포함되어 있지만 작업 결과는 포함되지 않습니다. 작업 결과를 얻으려면 별도의 명령을 실행해야 합니다. 명령을 실행하여 작업을 중지하고, 작업이 완료될 때까지 기다렸다가 작업을 삭제할 수도 있습니다.

백그라운드 작업의 타이밍을 다른 명령과 독립적으로 만들기 위해 각 백그라운드 작업은 자체 PowerShell 세션에서 실행됩니다. 그러나 이 연결은 작업을 실행하기 위해서만 만들어지고 제거되는 임시 연결이거나 여러 관련 작업 또는 명령을 실행하는 데 사용할 수 있는 영구 PSSession 일 수 있습니다.

작업 cmdlet 사용

Start-Job 명령을 사용하여 로컬 컴퓨터에서 백그라운드 작업을 시작합니다. Start-Job 는 작업 개체를 반환합니다. cmdlet을 사용하여 로컬 컴퓨터에서 시작된 작업을 나타내는 개체를 Get-Job 가져올 수도 있습니다.

작업 결과를 얻으려면 명령을 사용합니다 Receive-Job . 작업이 완료 Receive-Job 되지 않으면 부분 결과를 반환합니다. 세션에서 시작된 작업 중 하나 또는 전부가 완료될 때까지 cmdlet을 사용하여 Wait-Job 명령 프롬프트를 표시하지 않을 수도 있습니다.

백그라운드 작업을 중지하려면 cmdlet을 Stop-Job 사용합니다. 작업을 삭제하려면 cmdlet을 Remove-Job 사용합니다.

cmdlet의 작동 방식에 대한 자세한 내용은 각 cmdlet에 대한 도움말 항목을 참조하고 about_Jobs 참조하세요.

원격 컴퓨터에서 백그라운드 작업 시작

로컬 또는 원격 컴퓨터에서 백그라운드 작업을 만들고 관리할 수 있습니다. 백그라운드 작업을 원격으로 실행하려면 cmdletInvoke-Command의 AsJob 매개 변수를 사용하거나 cmdlet을 Invoke-Command 사용하여 원격으로 Start-Job 명령을 실행합니다. 대화형 세션에서 백그라운드 작업을 시작할 수도 있습니다.

원격 백그라운드 작업에 대한 자세한 내용은 about_Remote_Jobs 참조하세요.

자식 작업

각 백그라운드 작업은 부모 작업과 하나 이상의 자식 작업으로 구성됩니다. 사용하거나 AsJob 매개 변수Invoke-Command사용하기 Start-Job 시작한 작업에서 부모 작업은 임원입니다. 명령을 실행하거나 결과를 반환하지 않습니다. 명령은 실제로 자식 작업에 의해 실행됩니다. 다른 cmdlet을 사용하여 시작한 작업은 다르게 작동할 수 있습니다.

자식 작업은 부모 작업 개체의 ChildJobs 속성에 저장됩니다. ChildJobs 속성에는 하나 이상의 자식 작업 개체가 포함될 수 있습니다. 자식 작업 개체에는 부모 작업과 다른 Name, IDInstanceId 가 있으므로 부모 및 자식 작업을 개별적으로 또는 단위로 관리할 수 있습니다.

작업의 부모 및 자식 작업을 얻으려면 cmdlet의 IncludeChildJobs 매개 변수를 Get-Job 사용합니다. IncludeChildJob 매개 변수는 Windows PowerShell 3.0에서 도입되었습니다.

PS> Get-Job -IncludeChildJob

Id Name   PSJobTypeName State      HasMoreData   Location    Command
-- ----   ------------- -----      -----------   --------    -------
1  Job1   RemoteJob     Failed     True          localhost   Get-Process
2  Job2                 Completed  True          Server01    Get-Process
3  Job3                 Failed     False         localhost   Get-Process

부모 작업과 특정 상태 값을 가진 자식 작업만 얻으려면 cmdlet의 ChildJobState 매개 변수를 Get-Job 사용합니다. ChildJobState 매개 변수는 Windows PowerShell 3.0에서 도입되었습니다.

PS> Get-Job -ChildJobState Failed

Id Name   PSJobTypeName State      HasMoreData   Location    Command
-- ----   ------------- -----      -----------   --------    -------
1  Job1   RemoteJob     Failed     True          localhost   Get-Process
3  Job3                 Failed     False         localhost   Get-Process

PowerShell의 모든 버전에서 작업의 자식 작업을 얻으려면 부모 작업의 ChildJob 속성을 사용합니다.

PS> (Get-Job Job1).ChildJobs

Id Name   PSJobTypeName State      HasMoreData   Location    Command
-- ----   ------------- -----      -----------   --------    -------
2  Job2                 Completed  True          Server01    Get-Process
3  Job3                 Failed     False         localhost   Get-Process

다음 명령과 Get-Job 같이 자식 작업에서 명령을 사용할 수도 있습니다.

PS> Get-Job Job3

Id Name   PSJobTypeName State      HasMoreData   Location    Command
-- ----   ------------- -----      -----------   --------    -------
3  Job3                 Failed     False         localhost   Get-Process

자식 작업의 구성은 작업을 시작하는 데 사용하는 명령에 따라 달라집니다.

  • 로컬 컴퓨터에서 작업을 시작하는 데 사용하는 Start-Job 경우 작업은 임원 부모 작업과 명령을 실행하는 자식 작업으로 구성됩니다.

  • AsJob 매개 변수 Invoke-Command 를 사용하여 하나 이상의 컴퓨터에서 작업을 시작하는 경우 작업은 각 컴퓨터에서 실행되는 각 작업에 대한 임원 부모 작업 및 자식 작업으로 구성됩니다.

  • 하나 이상의 원격 컴퓨터에서 명령을 실행하는 Start-Job 데 사용하는 Invoke-Command 경우 결과는 각 원격 컴퓨터에서 실행되는 로컬 명령과 동일합니다. 이 명령은 각 컴퓨터에 대한 작업 개체를 반환합니다. 작업 개체는 관리자 부모 작업과 명령을 실행하는 하나의 자식 작업으로 구성됩니다.

부모 작업은 모든 자식 작업을 나타냅니다. 부모 작업을 관리할 때 연결된 자식 작업도 관리합니다. 예를 들어 부모 작업을 중지하면 모든 자식 작업이 중지됩니다. 부모 작업의 결과를 가져오는 경우 모든 자식 작업의 결과를 가져옵니다.

그러나 자식 작업을 개별적으로 관리할 수도 있습니다. 이는 작업 문제를 조사하거나 AsJob 매개 변수Invoke-Command를 사용하여 시작된 여러 자식 작업 중 하나의 결과만 가져올 때 가장 유용합니다.

다음 명령은 AsJob 매개 변수 Invoke-Command사용하여 로컬 컴퓨터와 두 개의 원격 컴퓨터에서 백그라운드 작업을 시작합니다. 이 명령은 변수에 작업을 $j 저장합니다.

PS> $j = Invoke-Command -ComputerName localhost, Server01, Server02 `
-Command {Get-Date} -AsJob

작업의 $jName 및 ChildJob 속성을 표시하면 명령이 각 컴퓨터에 대해 하나씩 3개의 자식 작업이 있는 작업 개체를 반환했음을 보여 줌

PS> $j | Format-List Name, ChildJobs

Name      : Job3
ChildJobs : {Job4, Job5, Job6}

부모 작업을 표시하면 작업이 실패한 것으로 표시됩니다.

PS> $j

Id Name   PSJobTypeName State      HasMoreData   Location
-- ----   ------------- -----      -----------   --------
3  Job3   RemotingJob   Failed     False         localhost,Server...

그러나 자식 작업을 가져오는 명령을 실행 Get-Job 하면 출력에 하나의 자식 작업만 실패했음이 표시됩니다.

PS> Get-Job -IncludeChildJobs

Id  Name   PSJobTypeName State      HasMoreData   Location    Command
--  ----   ------------- -----      -----------   --------    -------
3   Job3   RemotingJob   Failed     False         localhost,Server...
4   Job4                 Completed  True          localhost   Get-Date
5   Job5                 Failed     False         Server01    Get-Date
6   Job6                 Completed  True          Server02    Get-Date

모든 자식 작업의 결과를 얻으려면 cmdlet을 Receive-Job 사용하여 부모 작업의 결과를 가져옵니다. 그러나 다음 명령과 같이 특정 자식 작업의 결과를 가져올 수도 있습니다.

PS> Receive-Job -Name Job6 -Keep | Format-Table ComputerName,
>> DateTime -AutoSize
ComputerName DateTime
------------ --------
Server02     Thursday, March 13, 2008 4:16:03 PM

PowerShell 백그라운드 작업의 자식 작업 기능을 사용하면 실행하는 작업을 더 자세히 제어할 수 있습니다.

작업 유형

PowerShell은 다양한 작업에 대해 다양한 유형의 작업을 지원합니다. Windows PowerShell 3.0부터 개발자는 PowerShell에 새 작업 유형을 추가하고 모듈에 작업 원본 어댑터를 포함하는 "작업 원본 어댑터"를 작성할 수 있습니다. 모듈을 가져올 때 세션에서 새 작업 유형을 사용할 수 있습니다.

예를 들어 PSScheduledJob 모듈은 예약된 작업을 추가하고 PSWorkflow 모듈은 워크플로 작업을 추가합니다.

사용자 지정 작업 유형은 표준 PowerShell 백그라운드 작업과 크게 다를 수 있습니다. 예를 들어 예약된 작업은 디스크에 저장됩니다. 특정 세션에만 존재하지 않습니다. 워크플로 작업은 일시 중단되고 다시 시작될 수 있습니다.

사용자 지정 작업을 관리하는 데 사용하는 cmdlet은 작업 유형에 따라 달라집니다. 일부 경우에는 표준 작업 cmdlet(예: Get-JobStart-Job.)을 사용합니다. 다른 항목에는 특정 유형의 작업만 관리하는 특수 cmdlet이 함께 제공됩니다. 사용자 지정 작업 유형에 대한 자세한 내용은 작업 유형에 대한 도움말 항목을 참조하세요.

작업의 작업 유형을 찾으려면 cmdlet을 Get-Job 사용합니다. Get-Job 는 다양한 유형의 작업에 대해 서로 다른 작업 개체를 반환합니다. 반환하는 작업 개체의 PSJobTypeName 속성 값은 Get-Job 작업 유형을 나타냅니다.

다음 표에서는 PowerShell과 함께 제공되는 작업 유형을 나열합니다.

작업 유형 설명
BackgroundJob cmdlet을 Start-Job 사용하기 시작했습니다.
RemoteJob 의 AsJob 매개 변수 사용 시작
Invoke-Command Cmdlet.
PSWorkflowJob 워크플로의 AsJob 매개 변수 사용을 시작했습니다.
PSScheduledJob 작업 트리거에 의해 시작된 예약된 작업의 인스턴스입니다.
CIMJob 에서 cmdlet의 AsJob 매개 변수 사용 시작
CDXML 모듈.
WMIJob 에서 cmdlet의 AsJob 매개 변수 사용 시작
WMI 모듈.
PSEventJob 을 사용하여Register-ObjectEvent 생성 및 지정
Action 매개 변수를 사용한 작업 입니다.

참고: cmdlet을 Get-Job 사용하여 특정 형식의 작업을 가져오기 전에 작업 유형을 추가하는 모듈을 현재 세션으로 가져오는지 확인합니다. 그렇지 않으면 Get-Job 해당 형식의 작업을 가져올 수 없습니다.

예제

다음 명령은 로컬 백그라운드 작업, 원격 백그라운드 작업, 워크플로 작업 및 예약된 작업을 만듭니다. 그런 다음 cmdlet을 Get-Job 사용하여 작업을 가져옵니다. Get-Job 는 예약된 작업을 가져오지 않지만 예약된 작업의 시작된 인스턴스를 가져옵니다.

로컬 컴퓨터에서 백그라운드 작업을 시작합니다.

PS> Start-Job -Name LocalData {Get-Process}

Id Name        PSJobTypeName   State   HasMoreData   Location   Command
-- ----        -------------   -----   -----------   --------   -------
2  LocalData   BackgroundJob   Running        True   localhost  Get-Process

원격 컴퓨터에서 실행되는 백그라운드 작업을 시작합니다.

PS> Invoke-Command -ComputerName Server01 {Get-Process} `
-AsJob -JobName RemoteData

Id  Name        PSJobTypeName  State   HasMoreData   Location   Command
--  ----        -------------  -----   -----------   --------   -------
2   RemoteData  RemoteJob      Running        True   Server01   Get-Process

예약된 작업 만들기

PS>  Register-ScheduledJob -Name ScheduledJob -ScriptBlock `
 {Get-Process} -Trigger (New-JobTrigger -Once -At "3 PM")

Id         Name            JobTriggers     Command       Enabled
--         ----            -----------     -------       -------
1          ScheduledJob    1               Get-Process   True

워크플로를 만듭니다.

PS> workflow Test-Workflow {Get-Process}

워크플로를 작업으로 실행합니다.


PS> Test-Workflow -AsJob -JobName TestWFJob

Id  Name       PSJobTypeName   State   HasMoreData   Location   Command
--  ----       -------------   -----   -----------   --------   -------
2   TestWFJob  PSWorkflowJob   NotStarted     True   localhost  Get-Process

작업을 가져옵니다. 이 Get-Job 명령은 예약된 작업을 가져오지 않지만 시작된 예약된 작업의 인스턴스를 가져옵니다.

PS> Get-Job

Id  Name         PSJobTypeName  State     HasMoreData  Location  Command
--  ----         -------------  -----     -----------  --------  -------
2   LocalData    BackgroundJob  Completed True         localhost Get-Process
4   RemoteData   RemoteJob      Completed True         Server01  Get-Process
6   TestWFJob    PSWorkflowJob  Completed True         localhost WorkflowJob
8   ScheduledJob PSScheduledJob Completed True         localhost Get-Process

예약된 작업을 얻으려면 cmdlet을 Get-ScheduledJob 사용합니다.

PS> Get-ScheduledJob

Id         Name            JobTriggers     Command       Enabled
--         ----            -----------     -------       -------
1          ScheduledJob    1               Get-Process   True

참고 항목