Поделиться через


about_Remote_Jobs

Краткое описание

Описывается, как выполнять фоновые задания на удаленных компьютерах.

Длинное описание

PowerShell одновременно выполняет команды и сценарии с помощью заданий. Существует три типа заданий, предоставляемых PowerShell для поддержки параллелизма.

  • RemoteJob — команды и скрипты выполняются в удаленном сеансе.
  • BackgroundJob — команды и скрипты выполняются в отдельном процессе на локальном компьютере. Дополнительные сведения см. в about_Jobs.
  • PSTaskJob или ThreadJob — команды и сценарии выполняются в отдельном потоке в рамках одного процесса на локальном компьютере. Дополнительные сведения см. в about_Thread_Jobs.

Удаленное выполнение скриптов на отдельном компьютере или отдельном процессе обеспечивает большую изоляцию. Любые ошибки, возникающие в удаленном задании, не влияют на другие выполняемые задания или родительский сеанс, который запустил задание. Однако уровень удаленного взаимодействия добавляет дополнительные расходы, включая сериализацию объектов. Все объекты сериализуются и десериализируются при передаче между родительским сеансом и удаленным (заданием). Сериализация больших сложных объектов данных может использовать большие объемы вычислительных ресурсов и памяти и передавать большие объемы данных в сеть.

Важный

Родительский сеанс, созданный заданием, также отслеживает состояние задания и собирает данные конвейера. Дочерний процесс задания завершается родительским процессом после того, как задание достигнет готового состояния. Если родительский сеанс завершается, все выполняемые дочерние задания завершаются вместе со своими дочерними процессами.

Существует два способа обойти эту ситуацию:

  1. Используйте Invoke-Command для создания заданий, выполняемых в отключенных сеансах. См. раздел отсоединяемых процессов этой статьи.
  2. Используйте Start-Process для создания нового процесса, а не задания. Дополнительные сведения см. в начального процесса.

Удаленные задания

Задания можно запускать на удаленных компьютерах с помощью трех различных методов.

  • Запустите интерактивный сеанс на удаленном компьютере. Затем запустите задание в интерактивном сеансе. Эти процедуры совпадают с выполнением локального задания, хотя все действия выполняются на удаленном компьютере.

  • Запустите задание на удаленном компьютере, который возвращает результаты на локальный компьютер. Используйте этот метод, если вы хотите собрать результаты заданий и сохранить их в центральном расположении на локальном компьютере.

  • Запустите задание на удаленном компьютере, который сохраняет результаты на удаленном компьютере. Используйте этот метод, если данные задания более безопасно сохраняются на исходном компьютере.

Запуск задания в интерактивном сеансе

Вы можете запустить интерактивный сеанс с удаленным компьютером, а затем запустить задание во время интерактивного сеанса. Дополнительные сведения об интерактивных сеансах см. в about_Remoteи Enter-PSSession.

Процедура запуска задания в интерактивном сеансе почти идентична процедуре запуска фонового задания на локальном компьютере. Однако все операции выполняются на удаленном компьютере, а не на локальном компьютере.

  1. Используйте командлет Enter-PSSession для запуска интерактивного сеанса с удаленным компьютером. Для создания временного подключения для интерактивного сеанса можно использовать параметр ComputerName Enter-PSSession. Также можно использовать параметр сеанса для запуска интерактивного сеанса в сеансе PowerShell (PSSession).

    Следующая команда запускает интерактивный сеанс на компьютере Server01.

    C:\PS> Enter-PSSession -ComputerName Server01
    

    Командная строка изменится, чтобы показать, что вы подключены к компьютеру Server01.

    Server01\C:>
    
  2. Чтобы запустить удаленное задание в сеансе, используйте командлет Start-Job. Следующая команда запускает удаленное задание, которое получает события в журнале событий Windows PowerShell на компьютере Server01. Командлет Start-Job возвращает объект, представляющий задание.

    Эта команда сохраняет объект задания в переменной $job.

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

    Во время выполнения задания можно использовать интерактивный сеанс для выполнения других команд, включая другие задания. Однако интерактивный сеанс должен оставаться открытым, пока задание не будет завершено. Если завершить сеанс, задание прерывается и результаты теряются.

  3. Чтобы узнать, завершено ли задание, отобразите значение переменной $job или используйте командлет Get-Job для получения задания. Следующая команда использует командлет Get-Job для отображения задания.

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

    В выходных данных Get-Job показано, что задание выполняется на компьютере localhost, так как задание было запущено и запущено на том же компьютере (в данном случае Server01).

  4. Чтобы получить результаты задания, используйте командлет Receive-Job. Вы можете отобразить результаты в интерактивном сеансе или сохранить их в файле на удаленном компьютере. Следующая команда получает результаты задания в переменной $job. Команда использует оператор перенаправления (>) для сохранения результатов задания в файле PsLog.txt на компьютере Server01.

    Server01\C:> Receive-Job $job > C:\logs\PsLog.txt
    
  5. Чтобы завершить интерактивный сеанс, используйте командлет Exit-PSSession. Командная строка изменится, чтобы показать, что вы вернулись в исходный сеанс на локальном компьютере.

    Server01\C:> Exit-PSSession
    C:\PS>
    
  6. Чтобы просмотреть содержимое файла PsLog.txt на компьютере Server01 в любое время, запустите другой интерактивный сеанс или выполните удаленную команду. Этот тип команды лучше всего выполнять в PSSession (постоянное подключение), если вы хотите использовать несколько команд для изучения данных в файле PsLog.txt и управления ими. Дополнительные сведения о PSSessions см. в about_PSSessions.

    Следующие команды используют командлет New-PSSession для создания PSSession, подключенного к компьютеру Server01, и они используют командлет Invoke-Command для выполнения команды Get-Content в PSSession для просмотра содержимого файла.

    $s = New-PSSession -ComputerName Server01
    Invoke-Command -Session $s -ScriptBlock {
      Get-Content C:\logs\pslog.txt}
    

Запустите удаленное задание, которое возвращает результаты на локальный компьютер (AsJob)

Чтобы запустить задание на удаленном компьютере, который возвращает результаты команды локальному компьютеру, используйте параметр AsJob командлета, например командлет Invoke-Command.

При использовании параметра AsJob объект задания фактически создается на локальном компьютере, даже если задание выполняется на удаленном компьютере. После завершения задания результаты возвращаются на локальный компьютер.

Можно использовать командлеты, содержащие существительное задание (командлеты заданий) для управления любым заданием, созданным любым командлетом. Многие командлеты, имеющие параметры AsJob, не используют удаленное взаимодействие PowerShell, поэтому их можно использовать даже на компьютерах, которые не настроены для удаленного взаимодействия и не соответствуют требованиям для удаленного взаимодействия.

  1. Следующая команда использует параметр AsJobInvoke-Command для запуска задания на компьютере Server01. Задание выполняет команду Get-Eventlog, которая получает события в системном журнале. Параметр JobName можно использовать для назначения отображаемого имени заданию.

    Invoke-Command -ComputerName Server01 -ScriptBlock {
      Get-EventLog System} -AsJob
    

    Результаты команды похожи на следующие примеры выходных данных.

    SessionId   Name   State    HasMoreData   Location   Command
    ---------   ----   -----    -----------   --------   -------
    1           Job1   Running  True          Server01   Get-EventLog System
    

    При использовании параметра AsJobInvoke-Command возвращает тот же тип объекта задания, который Start-Job возвращается. Объект задания можно сохранить в переменной или использовать команду Get-Job для получения задания.

    Обратите внимание, что значение свойства Location показывает, что задание запущено на компьютере Server01.

  2. Чтобы управлять заданием, запущенным с помощью параметра AsJob командлета Invoke-Command, используйте командлеты задания. Так как объект задания, представляющий удаленное задание, находится на локальном компьютере, вам не нужно запускать удаленные команды для управления заданием.

    Чтобы определить, завершено ли задание, используйте команду Get-Job. Следующая команда получает все задания, запущенные в текущем сеансе.

    Get-Job
    

    Так как удаленное задание было запущено в текущем сеансе, локальная Get-Job команда получает задание. Свойство State объекта задания показывает, что команда выполнена успешно.

    SessionId   Name   State      HasMoreData   Location   Command
    ---------   ----   -----      -----------   --------   -------
    1           Job1   Completed  True          Server01   Get-EventLog System
    
  3. Чтобы получить результаты задания, используйте командлет Receive-Job. Так как результаты задания автоматически возвращаются на компьютер, где находится объект задания, можно получить результаты с помощью локальной команды Receive-Job.

    Следующая команда использует командлет Receive-Job для получения результатов задания. Он использует идентификатор сеанса для идентификации задания. Эта команда сохраняет задание в результате $results переменной. Вы также можете перенаправить результаты в файл.

    $results = Receive-Job -Id 1
    

Запуск удаленного задания, которое сохраняет результаты на удаленном компьютере

Чтобы запустить задание на удаленном компьютере, который сохраняет результаты команды на удаленном компьютере, используйте командлет Invoke-Command для выполнения команды Start-Job на удаленном компьютере. Этот метод можно использовать для запуска заданий на нескольких компьютерах.

При удаленном выполнении команды Start-Job объект задания создается на удаленном компьютере, а результаты задания сохраняются на удаленном компьютере. С точки зрения задания все операции являются локальными. Вы просто выполняете команды удаленно для управления локальным заданием на удаленном компьютере.

  1. Используйте командлет Invoke-Command для выполнения команды Start-Job на удаленном компьютере.

    Для этой команды требуется psSession (постоянное подключение). Если вы используете параметр ComputerName Invoke-Command для установления временного подключения, то команда Invoke-Command считается завершенной при возврате объекта задания. В результате временное подключение закрыто, а задание отменено.

    Следующая команда использует командлет New-PSSession для создания PSSession, подключенного к компьютеру Server01. Команда сохраняет PSSession в переменной $s.

    $s = New-PSSession -ComputerName Server01
    

    Следующая команда использует командлет Invoke-Command для выполнения команды Start-Job в PSSession. Команда Start-Job и команда Get-Eventlog заключены в фигурные скобки.

    Invoke-Command -Session $s -ScriptBlock {
      Start-Job -ScriptBlock {Get-EventLog System}}
    

    Результаты похожи на приведенные ниже выходные данные.

    Id       Name    State      HasMoreData     Location   Command
    --       ----    -----      -----------     --------   -------
    2        Job2    Running    True            Localhost  Get-EventLog System
    

    При удаленном выполнении команды Start-JobInvoke-Command возвращает тот же тип объекта задания, который Start-Job возвращается. Объект задания можно сохранить в переменной или использовать команду Get-Job для получения задания.

    Обратите внимание, что значение свойства Location показывает, что задание запущено на локальном компьютере, известном как LocalHost, даже если задание запущено на компьютере Server01. Так как объект задания создается на компьютере Server01 и задание выполняется на том же компьютере, оно считается локальным фоновым заданием.

  2. Для управления удаленным заданием используйте командлеты задания. Так как объект задания находится на удаленном компьютере, необходимо выполнить удаленные команды для получения, остановки, ожидания или получения результатов задания.

    Чтобы узнать, завершено ли задание, используйте команду Invoke-Command для выполнения команды Get-Job в PSSession, подключенной к компьютеру Server01.

    Invoke-Command -Session $s -ScriptBlock {Get-Job}
    

    Команда возвращает объект задания. Свойство состояния объекта задания показывает, что команда выполнена успешно.

    SessionId   Name  State      HasMoreData   Location   Command
    ---------   ----  -----      -----------   --------   -------
    2           Job2  Completed  True          LocalHost   Get-EventLog System
    
  3. Чтобы получить результаты задания, используйте командлет Invoke-Command для выполнения команды Receive-Job в PSSession, подключенной к компьютеру Server01.

    Следующая команда использует командлет Receive-Job для получения результатов задания. Он использует идентификатор сеанса для идентификации задания. Эта команда сохраняет задание в переменной $results. Он использует параметр Keep Receive-Job для сохранения результата в кэше заданий на удаленном компьютере.

    $results = Invoke-Command -Session $s -ScriptBlock {
      Receive-Job -SessionId 2 -Keep
    }
    

    Вы также можете перенаправить результаты в файл на локальном или удаленном компьютере. Следующая команда использует оператор перенаправления для сохранения результатов в файле на компьютере Server01.

    Invoke-Command -Session $s -Command {
      Receive-Job -SessionId 2 > C:\logs\pslog.txt
    }
    

Запуск в качестве отсоединяемого процесса

Как упоминалось ранее, при завершении родительского сеанса все выполняемые дочерние задания завершаются вместе со своими дочерними процессами. Для выполнения заданий, которые не подключены к текущему сеансу PowerShell, можно использовать удаленное взаимодействие на локальном компьютере.

Создайте новый сеанс PowerShell на локальном компьютере. Использование Invoke-Command для запуска задания в этом сеансе. Invoke-Command позволяет отключить удаленный сеанс и завершить родительский сеанс. Позже вы можете запустить новый сеанс PowerShell и подключиться к ранее отключенном сеансу, чтобы возобновить мониторинг задания. Однако все данные, возвращенные исходному сеансу PowerShell, теряются при завершении этого сеанса. При повторном подключении возвращаются только новые объекты данных, созданные после отключения.

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

В этом примере задания по-прежнему присоединяются к родительскому сеансу PowerShell. Однако родительский сеанс не является исходным сеансом PowerShell, где Invoke-Command был запущен.

См. также