PowerShell 에서 Job 관련 명령 및 병행 작업 에 대한 자세 한 설명
6699 단어 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:병렬 작업 을 간단하게 수행 하 는 스 크 립 트
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Powershell 7을 사용하여 Samba 서버로 파일을 전송하는 방법.MSSQL 덤프를 복사하여 콜드 스토리지 솔루션으로 원격 Linux Samba 서버에 저장하도록 설계한 twoScripts를 공유하고 싶습니다. 모든 서버가 Windows 서버였으며 내가 이것을 만들기로 결정한 이유...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.