Синхронизация фоновых заданий 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 получает только сериализованный снимок $j1 (статус задания в снимке никогда не изменится); кроме того, у каждого фонового задания есть собственный репозиторий заданий, поэтому объект $j кажется фиктивным в контексте $j2.

Задания могут синхронизироваться через мьютексы, файловую систему (если на одном компьютере) или БД и т. д., но мне интересно, предоставляет ли powershell какие-либо средства для удаленного взаимодействия для этого?


person Serguei    schedule 15.01.2013    source источник


Ответы (2)


Я не думаю, что это сработает, потому что объекты заданий относятся к их сеансу/пространству выполнения PowerShell. Командлет Start-Job запускает новое пространство выполнения (обычно это новый процесс). Я также не верю, что события PowerShell будут работать, потому что они также кажутся (согласно документам) специфичными для сеанса. Я бы сделал это просто и использовал файл - передал бы путь в оба задания.

person Keith Hill    schedule 15.01.2013
comment
Да, с файлами все в порядке (я использовал глобальные мьютексы, которые, я думаю, в любом случае поддерживаются файловой системой), если все находится на одной машине, что можно с уверенностью предположить, учитывая Start-Job (против Invoke-Command). - person Serguei; 16.01.2013

попробуйте это - в 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
person Ladislav    schedule 21.08.2016