about_Remote_Jobs

Krótki opis

Opisuje sposób uruchamiania zadań na komputerach zdalnych.

Szczegółowy opis

Program PowerShell współbieżnie uruchamia polecenia i skrypty za pośrednictwem zadań. Istnieją trzy typy zadań udostępniane przez program PowerShell do obsługi współbieżności.

  • RemoteJob - Polecenia i skrypty są uruchamiane w sesji zdalnej.
  • BackgroundJob - Polecenia i skrypty są uruchamiane w osobnym procesie na komputerze lokalnym. Aby uzyskać więcej informacji, zobacz opis polecenia about_Jobs.
  • PSTaskJob lub ThreadJob — polecenia i skrypty są uruchamiane w osobnym wątku w ramach tego samego procesu na komputerze lokalnym. Aby uzyskać więcej informacji, zobacz about_Thread_Jobs.

Zdalne uruchamianie skryptów na osobnej maszynie lub w osobnym procesie zapewnia doskonałą izolację. Wszelkie błędy występujące w zadaniu zdalnym nie mają wpływu na inne uruchomione zadania lub sesję nadrzędną, która uruchomiła zadanie. Jednak warstwa komunikacji automatycznej dodaje obciążenie, w tym serializacji obiektów. Wszystkie obiekty są serializowane i deserializowane, ponieważ są przekazywane między sesją nadrzędną a sesją zdalną (zadanie). Serializacja dużych złożonych obiektów danych może zużywać duże ilości zasobów obliczeniowych i pamięci oraz transferować duże ilości danych w sieci.

Ważne

Sesja nadrzędna, która utworzyła zadanie, monitoruje również stan zadania i zbiera dane potoku. Proces podrzędny zadania zostaje zakończony przez proces nadrzędny po osiągnięciu stanu zakończenia zadania. Jeśli sesja nadrzędna zostanie zakończona, wszystkie uruchomione zadania podrzędne zostaną zakończone wraz z procesami podrzędnymi.

Istnieją dwa sposoby obejścia tej sytuacji:

  1. Służy Invoke-Command do tworzenia zadań uruchamianych w sesjach bez połączenia. Zapoznaj się z sekcją odłączonych procesów tego artykułu.
  2. Użyj Start-Process polecenia , aby utworzyć nowy proces, a nie zadanie. Aby uzyskać więcej informacji, zobacz Rozpoczynanie procesu.

Zadania zdalne

Zadania można uruchamiać na komputerach zdalnych przy użyciu trzech różnych metod.

  • Uruchom sesję interaktywną na komputerze zdalnym. Następnie uruchom zadanie w sesji interaktywnej. Procedury są takie same jak uruchamianie zadania lokalnego, chociaż wszystkie akcje są wykonywane na komputerze zdalnym.

  • Uruchom zadanie na komputerze zdalnym, który zwraca wyniki na komputerze lokalnym. Użyj tej metody, jeśli chcesz zebrać wyniki zadań i zachować je w centralnej lokalizacji na komputerze lokalnym.

  • Uruchom zadanie na komputerze zdalnym, który utrzymuje jego wyniki na komputerze zdalnym. Użyj tej metody, gdy dane zadania są bezpieczniej przechowywane na komputerze źródłowym.

Uruchamianie zadania w sesji interakcyjnej

Możesz rozpocząć sesję interaktywną z komputerem zdalnym, a następnie uruchomić zadanie podczas sesji interakcyjnej. Aby uzyskać więcej informacji na temat sesji interakcyjnych, zobacz about_Remote i zobacz Enter-PSSession.

Procedura uruchamiania zadania w sesji interakcyjnej jest niemal identyczna z procedurą uruchamiania zadania w tle na komputerze lokalnym. Jednak wszystkie operacje są wykonywane na komputerze zdalnym, a nie na komputerze lokalnym.

  1. Enter-PSSession Użyj polecenia cmdlet , aby rozpocząć sesję interaktywną z komputerem zdalnym. Możesz użyć parametru ComputerName polecenia , Enter-PSSession aby ustanowić tymczasowe połączenie dla sesji interakcyjnej. Możesz też użyć parametru Sesja, aby uruchomić sesję interaktywną w sesji programu PowerShell (PSSession).

    Następujące polecenie uruchamia interaktywną sesję na komputerze Server01.

    C:\PS> Enter-PSSession -computername Server01
    

    Wiersz polecenia zmieni się, aby pokazać, że masz teraz połączenie z komputerem Server01.

    Server01\C:>
    
  2. Aby uruchomić zadanie zdalne w sesji, użyj Start-Job polecenia cmdlet . Następujące polecenie uruchamia zdalne zadanie, które pobiera zdarzenia w dzienniku zdarzeń programu Windows PowerShell na komputerze Server01. Polecenie Start-Job cmdlet zwraca obiekt reprezentujący zadanie.

    To polecenie zapisuje obiekt zadania w zmiennej $job .

    Server01\C:> $job = Start-Job -scriptblock {
      Get-Eventlog "Windows PowerShell"
    }
    

    Podczas uruchamiania zadania można użyć sesji interaktywnej do uruchamiania innych poleceń, w tym innych zadań. Należy jednak zachować otwartą sesję interaktywną do momentu ukończenia zadania. Jeśli zakończysz sesję, zadanie zostanie przerwane, a wyniki zostaną utracone.

  3. Aby dowiedzieć się, czy zadanie zostało ukończone, wyświetl wartość $job zmiennej lub użyj Get-Job polecenia cmdlet , aby pobrać zadanie. Następujące polecenie używa Get-Job polecenia cmdlet do wyświetlenia zadania.

    Server01\C:> Get-Job $job
    
    SessionId  Name  State      HasMoreData  Location   Command
    ---------  ----  -----      -----------  --------   -------
    1          Job1  Complete   True         localhost  Get-Eventlog "Windows...
    

    Dane Get-Job wyjściowe pokazują, że zadanie jest uruchomione na komputerze "localhost", ponieważ zadanie zostało uruchomione na tym samym komputerze (w tym przypadku Server01).

  4. Aby uzyskać wyniki zadania, użyj Receive-Job polecenia cmdlet . Wyniki można wyświetlić w sesji interaktywnej lub zapisać je w pliku na komputerze zdalnym. Następujące polecenie pobiera wyniki zadania w zmiennej $job. Polecenie używa operatora przekierowania (>), aby zapisać wyniki zadania w pliku PsLog.txt na komputerze Server01.

    Server01\C:> Receive-Job $job > c:\logs\PsLog.txt
    
  5. Aby zakończyć sesję interaktywną, użyj Exit-PSSession polecenia cmdlet . Wiersz polecenia zmieni się, aby pokazać, że jesteś z powrotem w oryginalnej sesji na komputerze lokalnym.

    Server01\C:> Exit-PSSession
    C:\PS>
    
  6. Aby wyświetlić zawartość PsLog.txt pliku na komputerze Server01 w dowolnym momencie, uruchom inną sesję interaktywną lub uruchom zdalne polecenie. Ten typ polecenia najlepiej uruchamiać w programie PSSession (trwałym połączeniu), jeśli chcesz użyć kilku poleceń do zbadania danych w PsLog.txt pliku i zarządzania nimi. Aby uzyskać więcej informacji na temat programu PSSessions, zobacz about_PSSessions.

    Następujące polecenia używają New-PSSession polecenia cmdlet do utworzenia psSession , który jest połączony z komputerem Server01, i używają Invoke-Command polecenia cmdlet do uruchomienia Get-Content polecenia w psSession, aby wyświetlić zawartość pliku.

    $s = New-PSSession -computername Server01
    Invoke-Command -session $s -scriptblock {
      Get-Content c:\logs\pslog.txt}
    

Uruchamianie zadania zdalnego zwracającego wyniki na komputer lokalny (AsJob)

Aby uruchomić zadanie na komputerze zdalnym, który zwraca wyniki polecenia do komputera lokalnego, użyj parametru AsJob polecenia cmdlet, takiego jak Invoke-Command polecenie cmdlet.

Jeśli używasz parametru AsJob , obiekt zadania jest faktycznie tworzony na komputerze lokalnym, mimo że zadanie jest uruchamiane na komputerze zdalnym. Po zakończeniu zadania wyniki są zwracane na komputer lokalny.

Aby zarządzać dowolnym zadaniem utworzonym przez dowolne polecenie cmdlet, możesz użyć poleceń cmdlet, które zawierają wartość noun zadania (job noun). Wiele poleceń cmdlet z parametrami asJob nie używa komunikacji zdalnej programu PowerShell, więc można ich używać nawet na komputerach, które nie są skonfigurowane do komunikacji zdalnej i które nie spełniają wymagań dotyczących komunikacji zdalnej.

  1. Następujące polecenie używa parametru AsJob polecenia Invoke-Command , aby uruchomić zadanie na komputerze Server01. Zadanie uruchamia Get-Eventlog polecenie, które pobiera zdarzenia w dzienniku systemu. Możesz użyć parametru JobName, aby przypisać nazwę wyświetlaną do zadania.

    Invoke-Command -computername Server01 -scriptblock {
      Get-Eventlog system} -AsJob
    

    Wyniki polecenia przypominają następujące przykładowe dane wyjściowe.

    SessionId   Name   State    HasMoreData   Location   Command
    ---------   ----   -----    -----------   --------   -------
    1           Job1   Running  True          Server01   Get-Eventlog system
    

    Gdy jest używany parametr AsJob, Invoke-Command zwraca ten sam typ obiektu zadania, który Start-Job zwraca. Obiekt zadania można zapisać w zmiennej lub użyć Get-Job polecenia w celu pobrania zadania.

    Należy pamiętać, że wartość właściwości Location pokazuje, że zadanie zostało uruchomione na komputerze Server01.

  2. Aby zarządzać zadaniem uruchomionym przy użyciu parametru Invoke-Command AsJob polecenia cmdlet, użyj poleceń cmdlet zadania. Ponieważ obiekt zadania, który reprezentuje zadanie zdalne, znajduje się na komputerze lokalnym, nie trzeba uruchamiać poleceń zdalnych w celu zarządzania zadaniem.

    Aby określić, czy zadanie zostało ukończone, użyj Get-Job polecenia . Następujące polecenie pobiera wszystkie zadania, które zostały uruchomione w bieżącej sesji.

    Get-Job
    

    Ponieważ zadanie zdalne zostało uruchomione w bieżącej sesji, polecenie lokalne Get-Job pobiera zadanie. Właściwość State obiektu zadania pokazuje, że polecenie zostało ukończone pomyślnie.

    SessionId   Name   State      HasMoreData   Location   Command
    ---------   ----   -----      -----------   --------   -------
    1           Job1   Completed  True          Server01   Get-Eventlog system
    
  3. Aby uzyskać wyniki zadania, użyj Receive-Job polecenia cmdlet . Ponieważ wyniki zadania są automatycznie zwracane na komputer, na którym znajduje się obiekt zadania, można uzyskać wyniki za pomocą polecenia lokalnego Receive-Job .

    Następujące polecenie używa Receive-Job polecenia cmdlet , aby uzyskać wyniki zadania. Używa identyfikatora sesji do identyfikowania zadania. To polecenie zapisuje wyniki zadania w zmiennej $results. Możesz również przekierować wyniki do pliku.

    $results = Receive-Job -id 1
    

Uruchamianie zadania zdalnego, które utrzymuje wyniki na komputerze zdalnym

Aby uruchomić zadanie na komputerze zdalnym, który utrzymuje wyniki polecenia na komputerze zdalnym, użyj Invoke-Command polecenia cmdlet, aby uruchomić Start-Job polecenie na komputerze zdalnym. Za pomocą tej metody można uruchamiać zadania na wielu komputerach.

Po zdalnym uruchomieniu Start-Job polecenia obiekt zadania jest tworzony na komputerze zdalnym, a wyniki zadania są zachowywane na komputerze zdalnym. Z perspektywy zadania wszystkie operacje są lokalne. Uruchamiasz polecenia zdalnie, aby zarządzać zadaniem lokalnym na komputerze zdalnym.

  1. Invoke-Command Użyj polecenia cmdlet , aby uruchomić Start-Job polecenie na komputerze zdalnym.

    To polecenie wymaga pssession (trwałe połączenie). Jeśli używasz parametru ComputerName do Invoke-Command ustanowienia połączenia tymczasowego, Invoke-Command polecenie jest uważane za ukończone po zwracaniu obiektu zadania. W związku z tym połączenie tymczasowe jest zamykane, a zadanie jest anulowane.

    Następujące polecenie używa New-PSSession polecenia cmdlet do utworzenia pssession, który jest połączony z komputerem Server01. Polecenie zapisuje plik PSSession w zmiennej $s .

    $s = New-PSSession -computername Server01
    

    Następne polecenie używa Invoke-Command polecenia cmdlet do uruchomienia Start-Job polecenia w programie PSSession. Polecenie Start-Job i Get-Eventlog polecenie są ujęte w nawiasy klamrowe.

    Invoke-Command -session $s -scriptblock {
      Start-Job -scriptblock {Get-Eventlog system}}
    

    Wyniki przypominają następujące przykładowe dane wyjściowe.

    Id       Name    State      HasMoreData     Location   Command
    --       ----    -----      -----------     --------   -------
    2        Job2    Running    True            Localhost  Get-Eventlog system
    

    Po zdalnym Invoke-Command uruchomieniu Start-Job polecenia zwraca ten sam typ obiektu zadania, który Start-Job zwraca. Obiekt zadania można zapisać w zmiennej lub użyć Get-Job polecenia w celu pobrania zadania.

    Należy pamiętać, że wartość właściwości Location pokazuje, że zadanie zostało uruchomione na komputerze lokalnym, znanym jako "LocalHost", mimo że zadanie zostało uruchomione na komputerze Server01. Ponieważ obiekt zadania jest tworzony na komputerze Server01, a zadanie jest uruchamiane na tym samym komputerze, jest uważane za lokalne zadanie w tle.

  2. Aby zarządzać zadaniem zdalnym, użyj poleceń cmdlet zadania . Ponieważ obiekt zadania znajduje się na komputerze zdalnym, należy uruchomić zdalne polecenia, aby pobrać, zatrzymać, poczekać lub pobrać wyniki zadania.

    Aby sprawdzić, czy zadanie zostało ukończone, użyj Invoke-Command polecenia , aby uruchomić Get-Job polecenie w programie PSSession połączonym z komputerem Server01.

    Invoke-Command -session $s -scriptblock {Get-Job}
    

    Polecenie zwraca obiekt zadania. Właściwość State obiektu zadania pokazuje, że polecenie zostało ukończone pomyślnie.

    SessionId   Name  State      HasMoreData   Location   Command
    ---------   ----  -----      -----------   --------   -------
    2           Job2  Completed  True          LocalHost   Get-Eventlog system
    
  3. Aby uzyskać wyniki zadania, użyj Invoke-Command polecenia cmdlet , aby uruchomić Receive-Job polecenie w programie PSSession połączonym z komputerem Server01.

    Następujące polecenie używa Receive-Job polecenia cmdlet , aby uzyskać wyniki zadania. Używa identyfikatora sesji do identyfikowania zadania. To polecenie zapisuje wyniki zadania w zmiennej $results . Używa parametru Keep parametru Receive-Job , aby zachować wynik w pamięci podręcznej zadań na komputerze zdalnym.

    $results = Invoke-Command -session $s -scriptblock {
      Receive-Job -SessionId 2 -Keep
    }
    

    Możesz również przekierować wyniki do pliku na komputerze lokalnym lub zdalnym. Następujące polecenie używa operatora przekierowania, aby zapisać wyniki w pliku na komputerze Server01.

    Invoke-Command -session $s -command {
      Receive-Job -SessionId 2 > c:\logs\pslog.txt
    }
    

Jak uruchomić jako proces odłączony

Jak wspomniano wcześniej, po zakończeniu sesji nadrzędnej wszystkie uruchomione zadania podrzędne są przerywane wraz z procesami podrzędnymi. Możesz użyć komunikacji zdalnej na komputerze lokalnym do uruchamiania zadań, które nie są dołączone do bieżącej sesji programu PowerShell.

Utwórz nową sesję programu PowerShell na komputerze lokalnym. Służy Invoke-Command do uruchamiania zadania w tej sesji. Invoke-Command umożliwia rozłączenie sesji zdalnej i zakończenie sesji nadrzędnej. Później możesz uruchomić nową sesję programu PowerShell i nawiązać połączenie z wcześniej odłączonej sesji, aby wznowić monitorowanie zadania. Jednak wszystkie dane, które zostały zwrócone do oryginalnej sesji programu PowerShell, zostaną utracone po zakończeniu tej sesji. Tylko nowe obiekty danych generowane po ponownym połączeniu zostaną zwrócone po ponownym połączeniu.

# 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
...

W tym przykładzie zadania są nadal dołączane do nadrzędnej sesji programu PowerShell. Jednak sesja nadrzędna nie jest oryginalną sesją programu PowerShell, w której Invoke-Command została uruchomiona.

Zobacz też