다음을 통해 공유


about_Jobs

항목
    about_Jobs

간단한 설명
    Windows PowerShell 백그라운드 작업이 현재 세션과 상호 작용하지 않고 백그라운드에서 명령이나 식을 
    실행하는 방식에 대한 정보를 제공합니다. 

자세한 설명
    이 항목에서는 로컬 컴퓨터의 Windows PowerShell에서 백그라운드 작업을 실행하는 방법에 대해 설명합니다. 
    원격 컴퓨터에서 백그라운드 작업을 실행하는 방법에 대한 자세한 내용은 about_Remote_Jobs를 
    참조하십시오. 
    
    백그라운드 작업을 시작하면 작업을 완료하는 데 시간이 오래 걸리더라도 명령 프롬프트는 즉시 반환됩니다. 
    작업이 실행되는 동안 중단 없이 세션에서 작업을 계속할 수 있습니다. 

    중요: Start-Job을 사용하거나 Invoke-Command의 AsJob 매개 변수를 사용하여 시작된 백그라운드 
          작업은 Windows PowerShell 원격 인프라를 통해 수행됩니다. 이러한 기능을 사용하려면 백그라운드 작업이 
          로컬 컴퓨터에서만 실행되는 경우에도 Windows PowerShell을 원격용으로 구성해야 합니다. 자세한 내용은 
          about_Remote_Requirements를 참조하십시오.

 
        
 로컬 컴퓨터에서 작업을 시작하는 방법
    로컬 컴퓨터에서 백그라운드 작업을 시작하려면 Start-Job cmdlet을 사용합니다. 

    Start-Job 명령을 작성하려면 작업을 실행하는 명령을 중괄호({ })로 묶습니다. 명령을 지정하려면 
    ScriptBlock 매개 변수를 사용합니다.

    다음 명령은 로컬 컴퓨터에서 Get-Process 명령을 실행하는 백그라운드 작업을 시작합니다.

        start-job -scriptblock {get-process}


    Start-Job 명령은 작업을 나타내는 개체를 반환합니다. 작업 개체에는 작업에 대한 유용한 정보가 
    포함되지만 작업 결과는 포함되지 않습니다.
    
    변수에 작업 개체를 저장한 다음 이 개체를 다른 Job cmdlet에 사용하여 백그라운드 작업을 관리합니다. 다음 
    명령은 작업 개체를 시작하고 결과 작업 개체를 $job 변수에 저장합니다.

        $job = start-job -scriptblock {get-process} 

    Get-Job cmdlet을 사용하여 현재 세션에서 시작한 작업을 나타내는 개체를 가져올 수도 있습니다. Get-
    Job은 Start-Job이 반환하는 동일한 작업 개체를 반환합니다.

 
 작업 개체 가져오기

    현재 세션에서 시작한 배경 작업을 나타내는 개체를 가져오려면 Get-Job cmdlet을 사용합니다. 매개 변수를 
    지정하지 않으면 Get-Job은 현재 세션에서 시작한 작업을 모두 반환합니다.

    예를 들어 다음 명령은 현재 세션의 작업을 가져옵니다.

    get-job


        Id  Name  State      HasMoreData  Location   Command
        --  ----  -----      -----------  --------   -------
        1   Job1  Running    True         localhost  get-process


    작업 개체를 변수에 저장한 후 이 개체를 사용하여 이후 명령에서 작업을 나타낼 수도 있습니다. 다음 
    명령은 ID 1인 작업을 가져와서 $job 변수에 저장합니다.

       $job = get-job -id 1 


    작업 개체에는 작업이 완료되었는지 여부를 나타내는 작업 상태가 포함됩니다. 완료된 작업은 "완료" 또는 
    "실패" 상태를 갖습니다. 작업이 차단되었거나 실행 중일 수도 있습니다.


    get-job


        Id  Name  State      HasMoreData  Location   Command
        --  ----  -----      -----------  --------   -------
        1   Job1  Complete    True         localhost  get-process



 작업 결과 가져오기

    백그라운드 작업을 실행하면 결과가 즉시 나타나지 않습니다. 대신 Start-Job cmdlet은 작업을 나타내는 
    작업 개체를 반환하지만 결과가 포함되지 않습니다. 백그라운드 작업 결과를 가져오려면 Receive-Job 
    cmdlet을 사용합니다.

    다음 명령은 Receive-Job cmdlet을 사용하여 작업의 결과를 가져오고, $job 변수에 저장된 작업 개체를 
    사용하여 작업을 식별합니다.

    receive-job -job $job

     Receive-Job cmdlet은 작업 결과를 반환합니다. 


           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

     또한 리디렉션 연산자(>) 또는 Out-File cmdlet을 사용하여 파일에 작업 결과를 저장할 수 있습니다. 다음 
     명령은 리디렉션 연산자를 사용하여 $job 변수의 작업 결과를 Results.txt 파일에 저장합니다.


        receive-job -job $job > results.txt


    

 부분 작업 결과 가져오기 및 유지

    Receive-Job cmdlet은 백그라운드 작업 결과를 반환합니다. 작업이 완료되면 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


    Receive-Job이 반환한 작업 결과를 삭제하지 않도록 하려면 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

    결과가 테이블에 표시됩니다. 작업의 상태가 State 열에 표시됩니다.

        Id  Name  State      HasMoreData  Location   Command
        --  ----  -----      -----------  --------   -------
        1   Job1  Complete    True         localhost  get-process
        2   Job2  Running     True         localhost  get-eventlog -log syst...
        3   Job3  Complete    True         localhost  dir -path c:\* -recurse


    이 경우 State 속성은 Job 2가 여전히 실행 중임을 나타냅니다. Receive-Job cmdlet을 사용하여 
    작업 결과를 지금 가져오는 경우 결과가 완전하지 않습니다. Receive-Job cmdlet을 반복해서 사용하여 모든 
    결과를 가져올 수 있습니다. 기본적으로 이 cmdlet을 사용할 때마다 아직 받지 않은 결과만 가져오지만 결과를 
    이미 받은 경우에도 Receive-Job cmdlet의 Keep 매개 변수를 사용하여 결과를 유지할 수 있습니다.

    이 시점에서 파일에 결과를 쓴 다음 새로 받은 결과가 도착할 때 새로 받은 결과를 첨부할 수 있습니다. 그렇지 
    않으면 기다렸다가 나중에 작업 상태를 확인할 수 있습니다.

    또는 Wait-Job cmdlet을 사용하여 작업 결과의 전체 또는 일부를 기다릴 수 있습니다. Wait-Job을 사용하여 
    특정 작업, 모든 작업 또는 작업의 일부가 완료될 때까지 기다릴 수 있습니다.
  
    다음 명령은 Wait-Job cmdlet을 사용하여 ID가 10인 작업을 기다립니다.

    wait-job -ID 10

    따라서 작업이 완료될 때까지 Windows PowerShell 프롬프트가 나타나지 않습니다.

    미리 지정된 기간 동안 기다릴 수도 있습니다. 이 명령은 Timeout 매개 변수를 사용하여 대기 시간을 120초로 
    제한합니다. 시간이 만료되면 명령 프롬프트가 반환되지만 작업은 백그라운드에서 계속 실행됩니다.

    wait-job -ID 10 -timeout 120


작업 중지

    백그라운드 작업을 중지하려면 Stop-Job cmdlet을 사용합니다. 다음 명령은 작업을 시작하여 시스템 
    이벤트 로그의 모든 항목을 가져오고, 해당 작업 개체를 $job 변수에 저장합니다.

    $job = start-job -scriptblock {get-eventlog -log system} 

    다음 명령은 작업을 중지하고, 파이프라인 연산자(|)를 사용하여 $job 변수의 작업을 Stop-Job으로 
    보냅니다.

    $job | stop-job


작업 삭제

    백그라운드 작업을 삭제하려면 Remove-Job cmdlet을 사용합니다. 다음 명령은 $job 변수의 작업을 
    삭제합니다.

    remove-job -job $job 


실패한 작업 조사

    작업이 실패한 이유를 확인하려면 작업 개체의 Reason 하위 속성을 사용합니다.

    다음 명령은 필수 자격 증명을 사용하지 않고 작업을 시작하며 해당 작업 개체를 $job 변수에 저장합니다.


         $job = start-job -scriptblock {new-item -path HKLM:\Software\MyCompany}

         Id   Name  State    HasMoreData  Location   Command
         --   ----  -----    -----------  --------   -------
         1    Job1  Failed   False         localhost  new-item -path HKLM:\S...


    다음 명령은 Reason 속성을 사용하여 작업 실패 원인이 되는 오류를 찾습니다.

         $job.ChildJobs[0].JobStateInfo.Reason


    이 경우 원격 컴퓨터에 명시적 자격 증명이 있어야 명령을 실행할 수 있기 때문에 작업이 실패했습니다. 
    Reason 속성 값은 다음과 같습니다

         다음 오류 메시지가 발생하여 원격 서버에 연결하지 못했습니다. 액세스가 거부되었습니다.


Job Cmdlet

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

    Get-Job          현재 세션에서 시작된 백그라운드 작업을 가져옵니다.

    Receive-Job      백그라운드 작업의 결과를 가져옵니다.
 
    Stop-Job         백그라운드 작업을 중지합니다.

    Wait-Job         한 개 작업 또는 모든 작업이 완료될 때까지 명령 프롬프트를 표시하지 않습니다.

    Remove-Job       백그라운드 작업을 삭제합니다.

    Invoke-Command  AsJob 매개 변수는 모든 명령을 원격 컴퓨터에서 백그라운드 작업으로 실행합니다. 
                    Invoke-Command를 사용하여 Start-Job 명령을 비롯한 작업 명령을 원격으로 실행할 
                    수도 있습니다.

 
참고 항목
   about_Remote_Jobs
   about_Job_Details
   about_Remote
   about_PSSessions  
   Start-Job
   Get-Job
   Receive-Job
   Stop-Job
   Wait-Job
   Remove-Job
   Invoke-Command