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
orThreadJob
— 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:
- Służy
Invoke-Command
do tworzenia zadań uruchamianych w sesjach rozłączonych. Zobacz sekcję procesów odłączonych w tym artykule. - 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.
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:>
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. PolecenieStart-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.
Aby dowiedzieć się, czy zadanie zostało ukończone, wyświetl wartość
$job
zmiennej lub użyjGet-Job
polecenia cmdlet , aby pobrać zadanie. Następujące polecenie używaGet-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).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
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>
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 wPsLog.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 uruchomieniaGet-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.
Następujące polecenie używa parametru AsJob polecenia ,
Invoke-Command
aby uruchomić zadanie na komputerze Server01. Zadanie uruchamiaGet-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óryStart-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.
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
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 lokalnegoReceive-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.
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 uruchomieniaStart-Job
polecenia w programie PSSession.Start-Job
Polecenie iGet-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óryStart-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.
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
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.