about_Remote_Jobs

Krótki opis

Opisuje sposób uruchamiania zadań w tle na komputerach zdalnych.

Opis szczegółowy

Program PowerShell uruchamia jednocześnie polecenia i skrypty za pośrednictwem zadań. Program PowerShell zapewnia trzy typy zadań 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 osobnym komputerze lub w osobnym procesie zapewnia dużą 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 zdalnej dodaje narzut, w tym serializacji obiektów. Wszystkie obiekty są serializowane i deserializowane, ponieważ są przekazywane między sesją nadrzędną i 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 przesyłać 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, gdy zadanie osiągnie stan zakończenia. Jeśli sesja nadrzędna zostanie przerwana, wszystkie uruchomione zadania podrzędne wraz z procesami podrzędnym zostaną zakończone.

Istnieją dwa sposoby na ominiecie tej sytuacji:

  1. Umożliwia Invoke-Command tworzenie zadań uruchamianych w sesjach rozłączonych. Zobacz sekcję odłączone procesy tego artykułu.
  2. Użyj Start-Process funkcji , aby utworzyć nowy proces, a nie zadanie. Aby uzyskać więcej informacji, zobacz Uruchamianie 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, mimo że wszystkie akcje są wykonywane na komputerze zdalnym.

  • Uruchom zadanie na komputerze zdalnym, który zwraca wyniki do komputera lokalnego. 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 przechowuje wyniki na komputerze zdalnym. Użyj tej metody, gdy dane zadania są bezpieczniej utrzymywane na komputerze inicjatora.

Uruchamianie zadania w sesji interakcyjnej

Możesz uruchomić sesję interaktywną z komputerem zdalnym, a następnie uruchomić zadanie podczas sesji interakcyjnej. Aby uzyskać więcej informacji na temat sesji interaktywnych, zobacz about_Remote i 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. Użyj polecenia Enter-PSSession cmdlet , aby uruchomić sesję interaktywną z komputerem zdalnym. Można użyć ComputerName parametru do Enter-PSSession ustanowienia tymczasowego połączenia dla sesji interakcyjnej. Możesz też użyć parametru Session, aby uruchomić sesję interaktywną w sesji programu PowerShell (PSSession).

    Następujące polecenie uruchamia sesję interaktywną 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 polecenia Start-Job cmdlet . Następujące polecenie uruchamia zadanie zdalne, które pobiera zdarzenia w Windows PowerShell dziennika zdarzeń 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 jest zakończone, $job Get-Job wyświetl wartość zmiennej lub użyj polecenia cmdlet w celu uzyskania zadania. Następujące polecenie używa polecenia Get-Job 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 polecenia Receive-Job cmdlet . Wyniki można wyświetlić w sesji interakcyjnej lub zapisać je w pliku na komputerze zdalnym. Następujące polecenie pobiera wyniki zadania w zmiennej $job zmiennej . Polecenie używa operatora przekierowania (>) do zapisania wyników 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ść pliku na PsLog.txt komputerze Server01 w dowolnym momencie, uruchom inną sesję interaktywną lub uruchom polecenie zdalne. Ten typ polecenia najlepiej uruchomić w pssession (połączenie trwałe), jeśli chcesz użyć kilku poleceń do badania i zarządzania danymi w pliku PsLog.txt . Aby uzyskać więcej informacji na temat konsoli PSSessions, zobacz about_PSSessions.

    New-PSSession Następujące polecenia cmdlet umożliwia utworzenie PSSession, który jest połączony z komputerem Server01 i Invoke-Command używają polecenia cmdlet Get-Content do uruchomienia polecenia w PSSession do wyświetlenia zawartości pliku.

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

Uruchamianie zadania zdalnego, które zwraca wyniki do komputera lokalnego (AsJob)

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

W przypadku użycia 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 do komputera lokalnego.

Można użyć polecenia cmdlet, które zawierają rzeczownik zadania (polecenia cmdlet zadania), aby zarządzać dowolnym zadaniem utworzonym przez dowolne polecenie cmdlet. Wiele poleceń cmdlet, które mają parametry usługi 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 AsJob parametru do Invoke-Command uruchomienia zadania na komputerze Server01. Zadanie uruchamia polecenie Get-Eventlog , które pobiera zdarzenia z dziennika 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 , zwraca Invoke-Command ten sam typ obiektu zadania, który zwraca Start-Job . Możesz zapisać obiekt zadania w zmiennej lub Get-Job użyć polecenia w celu uzyskania zadania.

    Należy pamiętać, że wartość właściwości Location wskazuje, że zadanie uruchomiono na komputerze Server01.

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

    Aby określić, czy zadanie jest zakoń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 Get-Job lokalne pobiera zadanie. Właściwość State obiektu zadania pokazuje, że polecenie zostało wykonane pomyślnie.

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

    Następujące polecenie używa polecenia Receive-Job cmdlet w celu uzyskania wyników zadania. Identyfikator sesji jest używany do identyfikowania zadania. To polecenie zapisuje wyniki zadania w $results zmiennej. Możesz również przekierować wyniki do pliku.

    $results = Receive-Job -id 1
    

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

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

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

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

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

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

    $s = New-PSSession -computername Server01
    

    Następne polecenie używa polecenia Invoke-Command cmdlet , aby uruchomić Start-Job polecenie w pssession. Polecenie Start-Job i polecenie są Get-Eventlog ujęte w nawiasy klamrowe.

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

    Wyniki są podobne do następujących przykładowych danych wyjściowych.

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

    Po zdalnym uruchomieniu Start-Job polecenia program Invoke-Command zwraca ten sam typ obiektu zadania, który zwraca Start-Job wartość . Możesz zapisać obiekt zadania w zmiennej Get-Job lub użyć polecenia , aby pobrać zadanie.

    Należy pamiętać, że wartość właściwości Location wskazuje, że zadanie uruchomiono na komputerze lokalnym, nazywanym "LocalHost", mimo że zadanie działało na komputerze Server01. Ponieważ obiekt zadania jest tworzony na komputerze Server01, a zadanie jest uruchamiane na tym samym komputerze, jest uznawane za lokalne zadanie w tle.

  2. Aby zarządzać zadaniem zdalnym, użyj polecenia cmdlet zadania. Ponieważ obiekt zadania znajduje się na komputerze zdalnym, należy uruchomić polecenia zdalne w celu pobrania, zatrzymania, oczekiwania lub pobrania wyników zadania.

    Aby sprawdzić, czy zadanie jest zakończone, Invoke-Command Get-Job użyj polecenia , aby uruchomić polecenie w pssession, który jest podłączony do komputera Server01.

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

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

    SessionId   Name  State      HasMoreData   Location   Command
    ---------   ----  -----      -----------   --------   -------
    2           Job2  Completed  True          LocalHost   Get-Eventlog system
    
  3. Aby uzyskać wyniki zadania, Invoke-Command użyj polecenia cmdlet Receive-Job , aby uruchomić polecenie w pssession, który jest podłączony do komputera Server01.

    Następujące polecenie używa polecenia Receive-Job cmdlet w celu uzyskania wyników zadania. Identyfikator sesji jest używany do identyfikowania zadania. To polecenie zapisuje wyniki zadania w zmiennej $results . Używa 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żna również przekierować wyniki do pliku na komputerze lokalnym lub zdalnym. Następujące polecenie używa operatora przekierowania do zapisania wyników w pliku na komputerze Server01.

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

Jak uruchomić jako odłączony proces

Jak wspomniano wcześniej, po zakończeniu sesji nadrzędnej wszystkie uruchomione zadania podrzędne są przerywane wraz z procesami podrzędnym. Komunikacja zdalna na komputerze lokalnym umożliwia uruchamianie zadań, które nie są dołączone do bieżącej sesji programu PowerShell.

Utwórz nową sesję programu PowerShell na komputerze lokalnym. Użycie do Invoke-Command uruchomienia 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 połączyć się z wcześniej rozłączona sesją, aby wznowić monitorowanie zadania. Jednak wszystkie dane zwrócone do oryginalnej sesji programu PowerShell zostaną utracone po zakończeniu tej sesji. Podczas ponownego połączenia są zwracane tylko nowe obiekty danych wygenerowane po rozłą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łączone do nadrzędnej sesji programu PowerShell. Jednak sesja nadrzędna nie jest oryginalną sesją programu PowerShell, w której została Invoke-Command uruchomione.

Zobacz też