about_Remote_Jobs
Krátký popis
Popisuje, jak spustit úlohy na pozadí na vzdálených počítačích.
Podrobný popis
PowerShell souběžně spouští příkazy a skripty prostřednictvím úloh. PowerShell poskytuje tři typy úloh, které podporují souběžnost.
RemoteJob
– Příkazy a skripty se spouštějí ve vzdálené relaci.BackgroundJob
– Příkazy a skripty se spouští v samostatném procesu na místním počítači. Další informace najdete v tématu Informace o úlohách.PSTaskJob
neboThreadJob
– Příkazy a skripty se spouští v samostatném vlákně v rámci stejného procesu na místním počítači. Další informace najdete v tématu about_Thread_Jobs.
Vzdálené spouštění skriptů na samostatném počítači nebo v samostatném procesu poskytuje skvělou izolaci. Všechny chyby, ke kterým dochází ve vzdálené úloze, nemají vliv na jiné spuštěné úlohy nebo nadřazenou relaci, která úlohu spustila. Vrstva vzdálené komunikace ale přidává režii, včetně serializace objektů. Všechny objekty jsou serializovány a deserializovány, protože se předávají mezi nadřazenou relací a vzdálenou relací (úloha). Serializace velkých složitých datových objektů může spotřebovávat velké objemy výpočetních a paměťových prostředků a přenášet velké objemy dat v síti.
Důležité
Nadřazená relace, která vytvořila úlohu, také monitoruje stav úlohy a shromažďuje data kanálu. Podřízený proces úlohy se ukončí nadřazeným procesem, jakmile úloha dosáhne stavu dokončení. Pokud je nadřazená relace ukončena, všechny spuštěné podřízené úlohy se ukončí spolu s podřízenými procesy.
Tato situace se dá obejít dvěma způsoby:
- Slouží
Invoke-Command
k vytváření úloh spuštěných v odpojených relacích. Projděte si část Odpojené procesy tohoto článku. - Slouží
Start-Process
k vytvoření nového procesu místo úlohy. Další informace naleznete v tématu Start-Process.
Vzdálené úlohy
Úlohy můžete spouštět na vzdálených počítačích pomocí tří různých metod.
Spusťte interaktivní relaci na vzdáleném počítači. Pak spusťte úlohu v interaktivní relaci. Postupy jsou stejné jako spuštění místní úlohy, i když všechny akce se provádějí ve vzdáleném počítači.
Spusťte úlohu ve vzdáleném počítači, která vrátí výsledky do místního počítače. Tuto metodu použijte, pokud chcete shromáždit výsledky úloh a udržovat je v centrálním umístění na místním počítači.
Spusťte úlohu na vzdáleném počítači, který udržuje výsledky na vzdáleném počítači. Tuto metodu použijte, pokud jsou data úlohy bezpečněji udržována na původním počítači.
Spuštění úlohy v interaktivní relaci
Interaktivní relaci můžete spustit se vzdáleným počítačem a pak spustit úlohu během interaktivní relace. Další informace o interaktivníchrelacích about_RemoteEnter-PSSession
ch
Postup spuštění úlohy v interaktivní relaci je téměř stejný jako postup spuštění úlohy na pozadí na místním počítači. Všechny operace však probíhají ve vzdáleném počítači, nikoli na místním počítači.
Pomocí rutiny
Enter-PSSession
spusťte interaktivní relaci se vzdáleným počítačem. Parametr ComputerNameEnter-PSSession
můžete použít k vytvoření dočasného připojení pro interaktivní relaci. Nebo můžete použít parametr Relace ke spuštění interaktivní relace v relaci PowerShellu (PSSession).Následující příkaz spustí interaktivní relaci na počítači Server01.
C:\PS> Enter-PSSession -computername Server01
Příkazový řádek se změní, aby se zobrazilo, že jste nyní připojeni k počítači Server01.
Server01\C:>
Pokud chcete spustit vzdálenou úlohu v relaci, použijte rutinu
Start-Job
. Následující příkaz spustí vzdálenou úlohu, která získá události v protokolu událostí Windows PowerShellu na počítači se serverem Server01. RutinaStart-Job
vrátí objekt, který představuje úlohu.Tento příkaz uloží objekt úlohy do
$job
proměnné.Server01\C:> $job = Start-Job -scriptblock { Get-Eventlog "Windows PowerShell" }
I když se úloha spustí, můžete pomocí interaktivní relace spustit další příkazy, včetně jiných úloh. Interaktivní relaci však musíte nechat otevřenou, dokud se úloha nedokončí. Pokud relaci ukončíte, úloha se přeruší a výsledky se ztratí.
Pokud chcete zjistit, jestli je úloha dokončená, zobrazte hodnotu
$job
proměnné nebo pomocí rutinyGet-Job
úlohu získejte. Následující příkaz pomocí rutinyGet-Job
zobrazí úlohu.Server01\C:> Get-Job $job SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 1 Job1 Complete True localhost Get-Eventlog "Windows...
Výstup
Get-Job
ukazuje, že úloha běží na počítači localhost, protože úloha byla spuštěna a běží na stejném počítači (v tomto případě Server01).Pokud chcete získat výsledky úlohy, použijte rutinu
Receive-Job
. Výsledky můžete zobrazit v interaktivní relaci nebo je uložit do souboru na vzdáleném počítači. Následující příkaz získá výsledky úlohy v proměnné $job. Příkaz pomocí operátoru přesměrování (>
) uloží výsledky úlohy do souboru PsLog.txt na počítači se serverem Server01.Server01\C:> Receive-Job $job > c:\logs\PsLog.txt
K ukončení interaktivní relace použijte rutinu
Exit-PSSession
. Příkazový řádek se změní, aby se zobrazilo, že jste zpět v původní relaci na místním počítači.Server01\C:> Exit-PSSession C:\PS>
Pokud chcete kdykoli zobrazit obsah
PsLog.txt
souboru na počítači Server01, spusťte jinou interaktivní relaci nebo spusťte vzdálený příkaz. Tento typ příkazu je nejlepší spustit v psSession (trvalé připojení) v případě, že chcete použít několik příkazů k prozkoumání a správě dat vPsLog.txt
souboru. Další informace o psSessions naleznete v tématu about_PSSessions.Následující příkazy používají rutinu
New-PSSession
k vytvoření psSession , která je připojena k počítači Server01, a pomocíInvoke-Command
této rutiny spustíGet-Content
příkaz v PSSession k zobrazení obsahu souboru.$s = New-PSSession -computername Server01 Invoke-Command -session $s -scriptblock { Get-Content c:\logs\pslog.txt}
Spusťte vzdálenou úlohu, která vrátí výsledky do místního počítače (AsJob).
Pokud chcete spustit úlohu na vzdáleném počítači, který vrací výsledky příkazu do místního počítače, použijte parametr AsJob rutiny, jako je například rutina Invoke-Command
.
Pokud použijete parametr AsJob , objekt úlohy se ve skutečnosti vytvoří v místním počítači, i když úloha běží na vzdáleném počítači. Po dokončení úlohy se výsledky vrátí do místního počítače.
Pomocí rutin, které obsahují podstatné jméno úlohy (rutiny úlohy), můžete spravovat jakoukoli úlohu vytvořenou libovolnou rutinou. Mnoho rutin, které mají parametry AsJob , nepoužívají vzdálené komunikace PowerShellu, takže je můžete použít i na počítačích, které nejsou nakonfigurovány pro vzdálené komunikace a které nesplňují požadavky pro vzdálené komunikace.
Následující příkaz používá parametr
Invoke-Command
AsJob ke spuštění úlohy na počítači Server01. Úloha spustíGet-Eventlog
příkaz, který získá události v systémovém protokolu. Pomocí parametru JobName můžete k úloze přiřadit zobrazovaný název.Invoke-Command -computername Server01 -scriptblock { Get-Eventlog system} -AsJob
Výsledky příkazu se podobají následujícímu ukázkovém výstupu.
SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 1 Job1 Running True Server01 Get-Eventlog system
Pokud se použije parametr AsJob,
Invoke-Command
vrátí stejný typ objektu úlohy, kterýStart-Job
vrací. Objekt úlohy můžete uložit do proměnné nebo můžete k získání úlohy použítGet-Job
příkaz.Všimněte si, že hodnota vlastnosti Location ukazuje, že úloha běžela na počítači Server01.
Pokud chcete spravovat úlohu spuštěnou pomocí parametru AsJob rutiny
Invoke-Command
, použijte rutiny Úlohy. Vzhledem k tomu, že objekt úlohy, který představuje vzdálenou úlohu, je v místním počítači, nemusíte ke správě úlohy spouštět vzdálené příkazy.Pokud chcete zjistit, jestli je úloha dokončená, použijte
Get-Job
příkaz. Následující příkaz získá všechny úlohy, které byly spuštěny v aktuální relaci.Get-Job
Vzhledem k tomu, že vzdálená úloha byla spuštěna v aktuální relaci, místní
Get-Job
příkaz získá úlohu. Vlastnost State objektu úlohy ukazuje, že příkaz byl úspěšně dokončen.SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 1 Job1 Completed True Server01 Get-Eventlog system
Pokud chcete získat výsledky úlohy, použijte rutinu
Receive-Job
. Vzhledem k tomu, že výsledky úlohy se automaticky vrátí do počítače, kde se nachází objekt úlohy, můžete výsledky získat pomocí místníhoReceive-Job
příkazu.Následující příkaz pomocí rutiny
Receive-Job
získá výsledky úlohy. K identifikaci úlohy používá ID relace. Tento příkaz uloží výsledky úlohy do proměnné $results. Výsledky můžete také přesměrovat do souboru.$results = Receive-Job -id 1
Spusťte vzdálenou úlohu, která uchovává výsledky ve vzdáleném počítači.
Pokud chcete spustit úlohu na vzdáleném počítači, který uchovává výsledky příkazů na vzdáleném počítači, použijte Invoke-Command
rutinu Start-Job
ke spuštění příkazu na vzdáleném počítači. Tuto metodu můžete použít ke spouštění úloh na více počítačích.
Když spustíte Start-Job
příkaz vzdáleně, objekt úlohy se vytvoří ve vzdáleném počítači a výsledky úlohy se zachovají ve vzdáleném počítači.
Z hlediska úlohy jsou všechny operace místní. Právě spouštíte příkazy vzdáleně ke správě místní úlohy na vzdáleném počítači.
Pomocí rutiny
Invoke-Command
spusťteStart-Job
příkaz na vzdáleném počítači.Tento příkaz vyžaduje psSession (trvalé připojení). Pokud k vytvoření dočasného
Invoke-Command
připojení použijete parametr ComputerName,Invoke-Command
je příkaz po vrácení objektu úlohy považován za dokončený. V důsledku toho se dočasné připojení zavře a úloha se zruší.Následující příkaz pomocí rutiny
New-PSSession
vytvoří psSession, která je připojena k počítači Server01. Příkaz uloží psSession do$s
proměnné.$s = New-PSSession -computername Server01
Následující příkaz použije rutinu
Invoke-Command
Start-Job
ke spuštění příkazu v psSession. PříkazStart-Job
aGet-Eventlog
příkaz jsou uzavřeny ve složených závorkách.Invoke-Command -session $s -scriptblock { Start-Job -scriptblock {Get-Eventlog system}}
Výsledky se podobají následujícímu ukázkovém výstupu.
Id Name State HasMoreData Location Command -- ---- ----- ----------- -------- ------- 2 Job2 Running True Localhost Get-Eventlog system
Při vzdáleném
Start-Job
Invoke-Command
spuštění příkazu vrátí stejný typ objektu úlohy, kterýStart-Job
vrací. Objekt úlohy můžete uložit do proměnné nebo můžete k získání úlohy použítGet-Job
příkaz.Všimněte si, že hodnota vlastnosti Location ukazuje, že úloha běžela na místním počítači, označované jako LocalHost, i když úloha běžela na počítači Server01. Vzhledem k tomu, že objekt úlohy je vytvořen na počítači Server01 a úloha běží na stejném počítači, je považována za místní úlohu na pozadí.
Ke správě vzdálené úlohy použijte rutiny Úlohy . Vzhledem k tomu, že objekt úlohy je ve vzdáleném počítači, musíte spustit vzdálené příkazy, abyste získali, zastavili, čekali nebo načetli výsledky úlohy.
Pokud chcete zjistit, jestli je úloha dokončená, spusťte
Invoke-Command
příkazGet-Job
v nástroji PSSession, který je připojený k počítači Server01.Invoke-Command -session $s -scriptblock {Get-Job}
Příkaz vrátí objekt úlohy. Vlastnost State objektu úlohy ukazuje, že příkaz byl úspěšně dokončen.
SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 2 Job2 Completed True LocalHost Get-Eventlog system
Pokud chcete získat výsledky úlohy, použijte
Invoke-Command
rutinuReceive-Job
ke spuštění příkazu v nástroji PSSession, který je připojený k počítači Server01.Následující příkaz pomocí rutiny
Receive-Job
získá výsledky úlohy. K identifikaci úlohy používá ID relace. Tento příkaz uloží výsledky úlohy do$results
proměnné. Pomocí parametruReceive-Job
Keep zachová výsledek v mezipaměti úlohy ve vzdáleném počítači.$results = Invoke-Command -session $s -scriptblock { Receive-Job -SessionId 2 -Keep }
Výsledky můžete také přesměrovat na soubor v místním nebo vzdáleném počítači. Následující příkaz používá operátor přesměrování k uložení výsledků do souboru na počítači Server01.
Invoke-Command -session $s -command { Receive-Job -SessionId 2 > c:\logs\pslog.txt }
Jak spustit jako odpojený proces
Jak jsme už zmínili, když je nadřazená relace ukončena, všechny spuštěné podřízené úlohy se ukončí spolu s podřízenými procesy. Pomocí vzdálené komunikace na místním počítači můžete spouštět úlohy, které nejsou připojené k aktuální relaci PowerShellu.
Na místním počítači vytvořte novou relaci PowerShellu. Slouží Invoke-Command
ke spuštění úlohy v této relaci. Invoke-Command
umožňuje odpojit vzdálenou relaci a ukončit nadřazenou relaci. Později můžete spustit novou relaci PowerShellu a připojit se k dříve odpojené relaci a pokračovat v monitorování úlohy. Při ukončení této relace se však všechna data vrácená do původní relace PowerShellu ztratí. Po opětovném připojení se vrátí pouze nové datové objekty vygenerované po odpojení.
# 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
...
V tomto příkladu jsou úlohy stále připojené k nadřazené relaci PowerShellu.
Nadřazená relace ale není původní relací PowerShellu, ve které Invoke-Command
byla spuštěna.