2

Я использую машину Windows в качестве сервера SSH. Я хочу удаленно запустить некоторые задачи, выполнение которых занимает несколько часов. Есть ли способ получить постоянный процесс даже после отключения удаленного сеанса SSH в Powershell?

4 ответа4

2

Используйте параметр RunasJob через сеанс PSSession:

(из справки about_remote_jobs)

НАЧАТЬ УДАЛЕННУЮ РАБОТУ, КОТОРАЯ ВОЗВРАЩАЕТ РЕЗУЛЬТАТЫ ЛОКАЛЬНОМУ КОМПЬЮТЕРУ (В РАБОТЕ)

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

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

Вы можете использовать командлеты, содержащие существительное Job (командлеты Job), для управления любым заданием, созданным любым командлетом. Многие командлеты с параметрами AsJob не используют удаленное взаимодействие Windows 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

Когда используется параметр AsJob, Invoke-Command возвращает объект задания того же типа, который возвращает 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
2

После некоторых экспериментов теперь я заменил ssh на PowerShell Remoting.

В частности, НАЧАТЬ УДАЛЕННУЮ РАБОТУ, КОТОРАЯ ХРАНИТ РЕЗУЛЬТАТЫ в разделе УДАЛЕННЫЕ КОМПЬЮТЕРЫ about_Remote_Jobs , было действительно полезно.

По сути, мой текущий рабочий процесс

  1. Откройте новую PSSession
  2. Вызовите команду (Invoke-Command) на удаленном сервере как задание с помощью Start-Job

Затем я могу свободно отключиться от сеанса, а затем снова подключиться к сеансу и получить результаты работы с помощью Receive-Job .

1

Поскольку OP использует ssh для подключения к Powershell с компьютера, отличного от Windows, он не может использовать сеансы Powershell. Он будет работать так, как если бы он был подключен к локальной машине. Командлет Start-Job должен выполнить свою задачу:

Start-Job -scriptblock {скрипт или команда, которую вы хотите запустить как задание}

1

То, что вы ищете, это PSSessions.

Со страницы about_pssessions на technet (http://technet.microsoft.com/en-us/library/hh847839.aspx)

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .