2013-01-15 2 views
2

동일한 세션에서 두 개의 백그라운드 작업이 시작된 경우 어떻게 다른 작업이 완료되었는지 결정할 수 있습니까? 처음에 나는이 같은 시도 : $j2$j1의 직렬화 된 스냅 샷 (스냅 샷 절대 변하지 않을 것의 작업 상태)를 얻을 수 있기 때문에 물론PowerShell 백그라운드 작업 동기화

$j1 = Start-Job { 
    Start-Sleep -Seconds 5 
    "j1 done" 
} 

$j2 = Start-Job { 
    param($j) 
    "j2 waiting..." 
    $j | Wait-Job 
    "j2 done" 
} -ArgumentList $j1.Finished 

$j1,$j2 | Receive-Job -Wait 

가 작동하지 않습니다; 또한 각각의 백그라운드 작업에는 자체 작업 저장소가 있으므로 $j2의 컨텍스트에서 $j 개체가 가짜 것으로 나타납니다.

작업은 뮤텍스, 파일 시스템 (동일한 컴퓨터에있는 경우) 또는 DB 등을 통해 동기화 할 수 있지만 powershell이 ​​원격 액세스가 가능한 모든 기능을 제공하는지 궁금합니다.

답변

1

작업 개체가 PowerShell 세션/실행 영역과 관련되어 있기 때문에 작동하지 않을 것이라고 생각합니다. Start-Job cmdlet는 새 실행 공간 (일반적으로 새 프로세스)을 실행합니다. PowerShell 이벤트가 세션별로 표시되기 때문에 (Docs에 따라) PowerShell 이벤트가 작동하지 않을 것이라고 생각합니다. 나는 그것을 간단하게 유지하고 파일을 사용한다. 두 경로 모두에 경로를 전달한다.

+0

파일을 사용하면 OK입니다 그래 (I 사용 어쨌든 파일 시스템에 의해 백업됩니다 생각 글로벌 뮤텍스)만큼 모두가 동일한 시스템에있어로하는 'Start-Job' (vs'Invoke-Command')이 주어 졌다고 가정하는 것이 안전합니다. – Serguei

0

이 시도 - PowerShell을 3.0 및 최신 :

$j1 = Start-Job { 
    Start-Sleep -Seconds 5 
    "j1 done" 
} 

$j2 = Start-Job { 
    "j2 waiting..." 
    $Using:j1 | Wait-Job 
    "j2 done" 
} 

$j1,$j2 | Receive-Job -Wait 
관련 문제