about_Remote_Jobs

간단한 설명

원격 컴퓨터에서 백그라운드 작업을 실행하는 방법을 설명합니다.

자세한 설명

PowerShell은 작업을 통해 명령 및 스크립트를 동시에 실행합니다. 동시성을 지원하기 위해 PowerShell에서 제공하는 세 가지 작업 유형이 있습니다.

  • RemoteJob - 명령 및 스크립트는 원격 세션에서 실행됩니다.
  • BackgroundJob - 명령 및 스크립트는 로컬 컴퓨터에서 별도의 프로세스로 실행됩니다. 자세한 내용은 about_Jobs 참조하세요.
  • PSTaskJob 또는 ThreadJob - 명령 및 스크립트는 로컬 컴퓨터의 동일한 프로세스 내에서 별도의 스레드에서 실행됩니다. 자세한 내용은 about_Thread_Jobs 참조하세요.

원격으로, 별도의 컴퓨터 또는 별도의 프로세스에서 스크립트를 실행하면 격리가 매우 깁니다. 원격 작업에서 발생하는 오류는 다른 실행 중인 작업 또는 작업을 시작한 부모 세션에 영향을 주지 않습니다. 그러나 원격 계층은 개체 serialization을 포함하여 오버헤드를 추가합니다. 모든 개체는 부모 세션과 원격(작업) 세션 간에 전달될 때 직렬화되고 역직렬화됩니다. 대규모 복합 데이터 개체의 직렬화는 많은 양의 컴퓨팅 및 메모리 리소스를 사용하고 네트워크를 통해 대량의 데이터를 전송할 수 있습니다.

Important

작업을 만든 부모 세션도 작업 상태 모니터링하고 파이프라인 데이터를 수집합니다. 작업이 완료된 상태에 도달하면 작업 자식 프로세스가 부모 프로세스에 의해 종료됩니다. 부모 세션이 종료되면 실행 중인 모든 자식 작업이 자식 프로세스와 함께 종료됩니다.

이 상황을 해결하는 방법에는 두 가지가 있습니다.

  1. 연결이 끊긴 세션에서 실행되는 작업을 만드는 데 사용합니다 Invoke-Command . 이 문서의 분리된 프로세스 섹션을 참조하세요.
  2. 작업 대신 새 프로세스를 만드는 데 사용합니다 Start-Process . 자세한 내용은 Start-Process를 참조하세요.

원격 작업

세 가지 방법을 사용하여 원격 컴퓨터에서 작업을 실행할 수 있습니다.

  • 원격 컴퓨터에서 대화형 세션을 시작합니다. 그런 다음 대화형 세션에서 작업을 시작합니다. 프로시저는 로컬 작업 실행과 동일하지만 모든 작업은 원격 컴퓨터에서 수행됩니다.

  • 로컬 컴퓨터에 결과를 반환하는 원격 컴퓨터에서 작업을 실행합니다. 작업의 결과를 수집하고 로컬 컴퓨터의 중앙 위치에 기본 때 이 메서드를 사용합니다.

  • 원격 컴퓨터에서 결과를 기본 원격 컴퓨터에서 작업을 실행합니다. 작업 데이터가 원래 컴퓨터에서 더 안전하게 기본 경우 이 메서드를 사용합니다.

대화형 세션에서 작업 시작

원격 컴퓨터로 대화형 세션을 시작한 다음 대화형 세션 중에 작업을 시작할 수 있습니다. 대화형 세션 에 대한 자세한 내용은 about_Remote 참조 Enter-PSSession하세요.

대화형 세션에서 작업을 시작하는 절차는 로컬 컴퓨터에서 백그라운드 작업을 시작하는 절차와 거의 동일합니다. 그러나 모든 작업은 로컬 컴퓨터가 아닌 원격 컴퓨터에서 발생합니다.

  1. cmdlet을 Enter-PSSession 사용하여 원격 컴퓨터로 대화형 세션을 시작합니다. ComputerName 매개 변수 Enter-PSSession 를 사용하여 대화형 세션에 대한 임시 연결을 설정할 수 있습니다. 또는 Session 매개 변수를 사용하여 PowerShell 세션(PSSession)에서 대화형 세션을 실행할 수 있습니다.

    다음 명령은 Server01 컴퓨터에서 대화형 세션을 시작합니다.

    C:\PS> Enter-PSSession -computername Server01
    

    명령 프롬프트가 변경되어 이제 Server01 컴퓨터에 연결되어 있음을 표시합니다.

    Server01\C:>
    
  2. 세션에서 원격 작업을 시작하려면 cmdlet을 Start-Job 사용합니다. 다음 명령은 Server01 컴퓨터의 Windows PowerShell 이벤트 로그에서 이벤트를 가져오는 원격 작업을 실행합니다. cmdlet은 Start-Job 작업을 나타내는 개체를 반환합니다.

    이 명령은 작업 개체를 변수에 $job 저장합니다.

    Server01\C:> $job = Start-Job -scriptblock {
      Get-Eventlog "Windows PowerShell"
    }
    

    작업이 실행되는 동안 대화형 세션을 사용하여 다른 작업을 비롯한 다른 명령을 실행할 수 있습니다. 그러나 작업이 완료될 때까지 대화형 세션을 열어 두어야 합니다. 세션을 종료하면 작업이 중단되고 결과가 손실됩니다.

  3. 작업이 완료되었는지 확인하려면 변수 값을 $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" 컴퓨터에서 작업이 실행 중임을 보여 줍니다.

  4. 작업의 결과를 얻으려면 cmdlet을 Receive-Job 사용합니다. 대화형 세션에서 결과를 표시하거나 원격 컴퓨터의 파일에 저장할 수 있습니다. 다음 명령은 $job 변수에서 작업의 결과를 가져옵니다. 이 명령은 리디렉션 연산자(>)를 사용하여 Server01 컴퓨터의 PsLog.txt 파일에 작업 결과를 저장합니다.

    Server01\C:> Receive-Job $job > c:\logs\PsLog.txt
    
  5. 대화형 세션을 종료하려면 cmdlet을 Exit-PSSession 사용합니다. 명령 프롬프트가 변경되어 로컬 컴퓨터의 원래 세션으로 돌아왔다는 것을 표시합니다.

    Server01\C:> Exit-PSSession
    C:\PS>
    
  6. 언제든지 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 원격을 사용하지 않으므로 원격으로 구성되지 않고 원격 요구 사항을 충족하지 않는 컴퓨터에서도 사용할 수 있습니다.

  1. 다음 명령은 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 컴퓨터에서 작업이 실행되었음을 나타냅니다.

  2. 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
    
  3. 작업의 결과를 얻으려면 cmdlet을 Receive-Job 사용합니다. 작업 결과가 작업 개체가 있는 컴퓨터에 자동으로 반환되므로 로컬 Receive-Job 명령을 사용하여 결과를 가져올 수 있습니다.

    다음 명령은 cmdlet을 Receive-Job 사용하여 작업 결과를 가져옵니다. 세션 ID를 사용하여 작업을 식별합니다. 이 명령은 작업 결과를 $results 변수에 저장합니다. 결과를 파일로 리디렉션할 수도 있습니다.

    $results = Receive-Job -id 1
    

원격 컴퓨터에서 결과를 유지하는 원격 작업 시작

원격 컴퓨터에서 명령 결과를 유지하는 원격 컴퓨터에서 작업을 시작하려면 cmdlet을 Invoke-Command 사용하여 원격 컴퓨터에서 Start-Job 명령을 실행합니다. 이 메서드를 사용하여 여러 컴퓨터에서 작업을 실행할 수 있습니다.

원격으로 Start-Job 명령을 실행하면 작업 개체가 원격 컴퓨터에 생성되고 작업 결과가 원격 컴퓨터에서 기본. 작업의 관점에서 모든 작업은 로컬입니다. 원격 컴퓨터에서 로컬 작업을 관리하기 위해 명령을 원격으로 실행하기만 하면 됩니다.

  1. 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-JobInvoke-Command 실행하면 반환되는 동일한 유형의 작업 개체를 Start-Job 반환합니다. 작업 개체를 변수에 저장하거나 명령을 사용하여 Get-Job 작업을 가져올 수 있습니다.

    Location 속성 값은 작업이 Server01 컴퓨터에서 실행된 경우에도 "LocalHost"라고 하는 로컬 컴퓨터에서 작업이 실행되었음을 보여줍니다. 작업 개체는 Server01 컴퓨터에서 만들어지고 작업이 동일한 컴퓨터에서 실행되므로 로컬 백그라운드 작업으로 간주됩니다.

  2. 원격 작업을 관리하려면 작업 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
    
  3. 작업의 결과를 얻으려면 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 이 아닙니다.

참고 항목