about_Remote_Jobs
Krótki opis
Opisuje sposób uruchamiania zadań w tle 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
lubThreadJob
— 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:
- 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. - 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.
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:>
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. 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 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.
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ą, 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>
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 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 psSession , który jest połączony z komputerem Server01, i używająInvoke-Command
polecenia cmdlet do uruchomieniaGet-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.
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 w celu pobrania zadania.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 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 uruchomieniaStart-Job
polecenia w programie PSSession. PolecenieStart-Job
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
Invoke-Command
uruchomieniuStart-Job
polecenia zwraca ten sam typ obiektu zadania, któryStart-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.
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 parametruReceive-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.