about_Remote_Jobs

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

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

Подробное описание

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

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

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

Важно!

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

Обойти эту ситуацию можно двумя способами:

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

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

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

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

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

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

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

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

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

  1. Используйте командлет для Enter-PSSession запуска интерактивного сеанса на удаленном компьютере. Для установки временного подключения к интерактивному сеансу можно использовать параметр Enter-PSSession ComputerName . Или можно использовать параметр Session для запуска интерактивного сеанса в сеансе 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 объект задания фактически создается на локальном компьютере, даже если задание выполняется на удаленном компьютере. После завершения задания результаты возвращаются на локальный компьютер.

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

  1. Следующая команда использует параметр AsJob для Invoke-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
    

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

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

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

    Чтобы определить, завершено ли задание, используйте 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-Job команды возвращает объект задания того же типа, Invoke-Command который Start-Job возвращает. Вы можете сохранить объект задания в переменной или использовать Get-Job команду для получения задания.

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

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

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

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

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

    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.

Create новый сеанс 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 был запущен.

См. также раздел