about_Remote_Jobs

Krótki opis

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

Opis szczegółowy

Program PowerShell współbieżnie uruchamia polecenia i skrypty za pomocą 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 or 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 oddzielnej 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 sieciowej 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 jest przerywany 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 rozłączonych. Zobacz sekcję procesów odłączonych w tym artykule.
  2. Użyj polecenia Start-Process , aby utworzyć nowy proces, a nie zadanie. Aby uzyskać więcej informacji, zobacz Rozpoczęcie 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 interakcyjnej. 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, gdy chcesz zebrać wyniki zadań i zachować je w centralnej lokalizacji na komputerze lokalnym.

  • Uruchom zadanie na komputerze zdalnym, który utrzymuje 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 występują na komputerze zdalnym, a nie na komputerze lokalnym.

  1. Enter-PSSession Użyj polecenia cmdlet , aby rozpocząć sesję interaktywną z komputerem zdalnym. Można użyć parametru ComputerName , 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 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 Start-Job polecenia cmdlet . Następujące polecenie uruchamia zadanie zdalne, które pobiera zdarzenia w dzienniku zdarzeń 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 interakcyjnej 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ą Exit-PSSession , użyj 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 jest 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 serwera PSSession połączonego z komputerem Server01 i używają Invoke-Command polecenia cmdlet do uruchomienia Get-Content polecenia w programie PSSession w celu wyświetlenia zawartości pliku.

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

Uruchom zadanie zdalne zwracające wyniki na komputerze lokalnym (AsJob)

Aby uruchomić zadanie na komputerze zdalnym, który zwraca wyniki polecenia na komputerze lokalnym, 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.

Możesz użyć poleceń cmdlet zawierających czasownik zadania (polecenia cmdlet zadania), aby zarządzać dowolnym zadaniem utworzonym przez dowolne polecenie cmdlet. 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 , aby pobrać zadanie.

    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-CommandAsJob 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 połączenia PSSession (trwałego połączenia). Jeśli używasz parametru ComputerName w Invoke-Command celu nawiązania połączenia tymczasowego, Invoke-Command polecenie jest uważane za ukończone po powrocie obiektu zadania. W związku z tym połączenie tymczasowe jest zamykane i zadanie jest anulowane.

    Następujące polecenie używa New-PSSession polecenia cmdlet do utworzenia serwera PSSession połączonego 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. Start-Job Polecenie 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 uruchomieniu Start-Job polecenia zwracany jest ten sam typ obiektu zadania, który Start-Job zwraca. Invoke-Command Obiekt zadania można zapisać w zmiennej lub użyć Get-Job polecenia , aby pobrać zadanie.

    Należy pamiętać, że wartość właściwości Location pokazuje, że zadanie uruchomione na komputerze lokalnym, znane 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
    }
    

    Wyniki można również przekierować 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 odłączony proces

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 rozłączną sesją, 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 są zwracane 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łą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ż