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 nebo ThreadJob – 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:

  1. 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.
  2. 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.

  1. Pomocí rutiny Enter-PSSession spusťte interaktivní relaci se vzdáleným počítačem. Parametr ComputerName Enter-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:>
    
  2. 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. Rutina Start-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í.

  3. Pokud chcete zjistit, jestli je úloha dokončená, zobrazte hodnotu $job proměnné nebo pomocí rutiny Get-Job úlohu získejte. Následující příkaz pomocí rutiny Get-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).

  4. 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
    
  5. 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>
    
  6. 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 v PsLog.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.

  1. 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žít Get-Job příkaz.

    Všimněte si, že hodnota vlastnosti Location ukazuje, že úloha běžela na počítači Server01.

  2. 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
    
  3. 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ího Receive-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.

  1. Pomocí rutiny Invoke-Command spusťte Start-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-CommandStart-Job ke spuštění příkazu v psSession. Příkaz Start-Job a Get-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-JobInvoke-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žít Get-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í.

  2. 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říkaz Get-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
    
  3. Pokud chcete získat výsledky úlohy, použijte Invoke-Command rutinu Receive-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í parametru Receive-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.

Viz také