PowerShell 에서 Job 관련 명령 및 병행 작업 에 대한 자세 한 설명

머리말
PowerShell 에서 배경 작업 을 쉽게 수행 하고 여러 배경 작업 을 병행 할 수 있 습 니 다.본 고 는 PowerShell 에서 Job 과 관련 된 명령 을 소개 하고 demo 를 통 해 배경 에서 여러 작업 을 동시에 수행 하 는 방법 을 보 여 줍 니 다.다음은 더 이상 할 말 이 없 으 니 상세 한 소 개 를 해 봅 시다.
PowerShell 에서 배경 작업 을 수행 하 는 모드
다음 그림 은 PowerShell 에서 배경 작업 을 수행 하 는 프로 세 스 모델 을 설명 합 니 다.(이 그림 은 인터넷 에서 온 것 입 니 다.)

우선 Start-Job 명령 을 실행 하고 배경 작업 을 실행 하 는 PowerShell 프로 세 스 가 필요 합 니 다.모든 배경 작업 은 새로 시작 하 는 PowerShell 프로 세 스에 서 실 행 됩 니 다.따라서 세 개의 배경 작업 을 동시에 시작 하면 모두 네 개의 PowerShell 프로 세 스 가 동시에 실 행 됩 니 다.
Job 관련 명령
Start-Job 명령 은 배경 에서 실행 되 는 작업 을 시작 합 니 다.Start-Job 명령 을 통 해 작업 을 실행 할 때마다 별도의 PowerShell 프로 세 스 를 만 듭 니 다.
Stop-Job 명령 은 실행 중인 배경 작업 을 중단 하 는 데 사 용 됩 니 다.(Start-Job 에서 시작 하 는 작업)
Get-Job 명령 은 현재 session 의 배경 작업 대상 을 가 져 오 는 데 사 용 됩 니 다.
Wait-Job 명령 은 현재 실행 절 차 를 막 고 지정 한 배경 작업 이 끝 날 때 까지 기 다 립 니 다.
Receive-Job 명령 은 배경 에서 작업 을 수행 하 는 결 과 를 얻 는 데 사 용 됩 니 다.예 를 들 어 배경 작업 이 끝 날 때 Receive-Job 을 통 해 결 과 를 얻 고 작업 이 실 행 될 때의 output 를 출력 할 수 있 습 니 다.
Remove-Job 명령 은 현재 session 에서 완 료 된 작업 을 삭제 합 니 다.작업 이 끝 난 후에 도 자동 으로 삭제 되 지 않 습 니 다.Remove-Job 명령 을 사용 하여 삭제 하거나 이 session 을 닫 지 않 는 한.Remove-Job 을 사용 하여 실행 중인 작업 을 삭제 하면 명령 이 실 패 됩 니 다.이 때 는 Stop-Job 명령 을 사용 하여 작업 을 중지 한 다음 Remove-Job 으로 삭제 해 야 합 니 다.
백 스테이지 에서 임 무 를 수행 하 다
배경 에서 실행 되 는 작업 만 시작 하면 작업 수행 결 과 를 알 필요 도 없고 작업 이 언제 끝 날 지 관심 도 없습니다.그러면 Start-Job 명령 으로 작업 을 시작 하면 됩 니 다.

> Start-Job -ScriptBlock { sleep 5 }
단일 작업 을 시작 하고 작업 이 끝 날 때 까지 기 다 립 니 다.
대부분의 경우 우 리 는 작업 의 종료 시간 을 알 아야 합 니 다.이 때 Wait-Job 명령 을 통 해 작업 이 끝 날 때 까지 실행 절 차 를 막 을 수 있 습 니 다.

> Start-Job -ScriptBlock { sleep 5; Write-Host "Hello world."; } | Wait-Job

메모:위의 내용 은 Wait-Job 명령 으로 출력 되 었 으 며,당시 작업 의 상 태 는"Complete"였 습 니 다.
더 나 아가 우 리 는 작업 수행 과정 에서 의 출력 을 얻 고 싶 습 니 다.이 럴 때 는 Receive-Job 명령 을 사용 해 야 합 니 다.작업 이 시 작 된 후 언제든지 Receive-Job 명령 을 실행 할 수 있 습 니 다.그러나 완전한 출력 을 얻 으 려 면 작업 이 끝 난 후에 호출 해 야 합 니 다.이 때 는 Wait-Job 명령 과 함께 사용 해 야 합 니 다.

$job = Start-Job -ScriptBlock { sleep 5; Write-Host "Hello world."; }
Wait-Job $job
Receive-Job -Job $job
위의 코드 를 파일 mytask.ps1 에 저장 하여 실행:

Receive-Job 명령 은 배경 에서 수행 하 는 작업 의 output 를 출력 합 니 다.
백 스테이지 에서 여러 작업 을 수행 하고 끝 날 때 까지 기 다 립 니 다.
Start-Job 명령 이 차단 되 지 않 기 때문에 이론 적 으로 우 리 는 여러 번 임 의 를 수행 하여 많은 배경 임 무 를 시작 할 수 있 습 니 다.하나의 작업 을 기다 리 는 것 과 마찬가지 로 Wait-Job 명령 을 사용 하여 모든 작업 이 끝 날 때 까지 기다 릴 수 있 습 니 다.그러나 이 때 는 Get-Job 명령 과 함께 사용 해 야 합 니 다.

> Get-Job | Wait-Job
더 자주 사용 하 는 방식 은 while 순환 에서 작업 의 상 태 를 계속 검사 하 는 것 입 니 다.모든 작업 의 상태 가'Complete'일 때 모든 작업 의 수행 이 끝 났 음 을 표시 합 니 다.

Remove-Job *
#      
$start_time = (Get-Date)
Start-Job -ScriptBlock { sleep 9; Write-Host "Hello myJob1."; } -Name "myJob1"
Start-Job -ScriptBlock { sleep 5; Write-Host "Hello myJob2."; } -Name "myJob2"
$taskCount = 2
while($taskCount -gt 0)
{
 foreach($job in Get-Job)
 {
  $state = [string]$job.State
  if($state -eq "Completed")
  { 
   Write-Host($job.Name + "     ")
   Receive-Job $job
   $taskCount--
   Remove-Job $job
  }
 }
 sleep 1
}
"       " 
#         
(New-TimeSpan $start_time).totalseconds
위의 코드 를 my task.ps1 파일 에 저장 하고 실행 합 니 다:

코드 에서 우 리 는 모든 작업 에 이름 을 짓 고 while 순환 에서 Get-Job 명령 을 사용 하여 작업 의 현재 상 태 를 검사 합 니 다.작업 의 상태 가"Complete"인 것 을 발견 하면 Remove-Job 명령 을 통 해 삭제 하고 삭제 하기 전에 작업 의 이름과 output 를 인쇄 합 니 다.
배경 작업 을 수행 하 는 함 수 를 패키지 합 니 다.
다음은 여러 작업 을 수행 하기 위해 간단 한 함 수 를 패키지 합 니 다.

function Run-Tasks
{
 Param
 (
  $taskArr,
  $parallelcount=1
 )
 #      
 $startTime = (Get-Date)
  #                
 Remove-Job *
 #      $taskCount              
 $taskCount = $taskArr.Length
 
 #                         
 if($parallelCount -gt $taskArr.Length)
 {
  $parallelCount = $taskArr.Length
 }
 #      
 foreach($i in 1..$parallelCount)
 {
  Start-Job $taskArr[$i - 1] -Name "task$i"
 }
 #            
 $nextIndex = $parallelCount
 #                     ,                ,
 #                   ,            。
 while(($nextIndex -lt $taskArr.Length) -or ($taskCount -gt 0))
 {
  foreach($job in Get-Job)
  {
   $state = [string]$job.State
   if($state -eq "Completed")
   { 
    Write-Host($job.Name + "     ,    :")
    Receive-Job $job
    Remove-Job $job
    $taskCount--
    if($nextIndex -lt $taskArr.Length)
    { 
     $taskNumber = $nextIndex + 1
     Start-Job $taskArr[$nextIndex] -Name "task$taskNumber"
     $nextIndex++
    }
   }
  }
  sleep 1
 }
 "       "
 #         
 (New-TimeSpan $startTime).totalseconds
}
위의 함 수 는 배경 에서 사용자 의 작업 을 수행 하고 모든 작업 이 끝 날 때 까지 기 다 립 니 다.또한 사용 자 는 동시에 실행 되 는 작업 의 개 수 를 지정 할 수 있 으 며,작업 이 완 료 된 후 출력 작업 의 output 를 지정 할 수 있 습 니 다.다음은 이 함 수 를 사용 하여 임 무 를 수행 해 보 겠 습 니 다.

#   6    
$task1 = {sleep 12; Write-Host "Hello myJob1."; }
$task2 = {sleep 5; Write-Host "Hello myJob2."; }
$task3 = {sleep 8; Write-Host "Hello myJob3."; }
$task4 = {sleep 3; Write-Host "Hello myJob4."; }
$task5 = {sleep 20; Write-Host "Hello myJob5."; }
$task6 = {sleep 15; Write-Host "Hello myJob6."; } 
#  6                  
$taskArr = $task1, $task2, $task3, $task4, $task5, $task6
#        ,       4    
Run-Tasks -taskArr $taskArr -parallelcount 4
다음은 실행 결과 입 니 다.

총결산
마음대로 백 스테이지 에서 미 션 을 수행 할 수 있다 는 게 너무 좋 은 것 같 아 요!물론 일 에 있어 서 당신 은 일 을 빠 르 고 잘 할 수 있 습 니 다.본 고 는 병렬 작업 을 간단하게 실행 하 는 demo 를 제공 할 뿐 이상 처리 등 중요 한 내용 을 생략 하 였 으 나,이것 은 PowerShell 병행 작업 을 시작 하기에 충분 합 니 다.
참고:
《윈도우 PowerShell 실전 2 판》
Powershell:병렬 작업 을 간단하게 수행 하 는 스 크 립 트

좋은 웹페이지 즐겨찾기