Как узнать, какие процессы запускаются командой Start-Job?

Я (унаследовал) сценарий PowerShell, который вызывает другие сценарии PowerShell, вызывая их с Start-Job Командлет и -FilePath параметр. Например, у меня есть скрипт, который ничего не делает:

Start-Sleep -Seconds 86400

Который я могу вызвать через работу:

PS> Start-Job -Name "Test Job" -FilePath ".\Wait-AllDay.ps1"

Id Name     PSJobTypeName State   HasMoreData Location  Command                        
-- ----     ------------- -----   ----------- --------  -------                        
2  Test Job BackgroundJob Running True        localhost Start-Sleep...

PS> Get-Job -Id 2

State         : Running
HasMoreData   : True
StatusMessage : 
Location      : localhost
Command       : Start-Sleep -Seconds (60*60*24)
JobStateInfo  : Running
Finished      : System.Threading.ManualResetEvent
InstanceId    : 0c0e2c32-cbc5-4d70-b7cb-28771626cf20
Id            : 2
Name          : Test Job
ChildJobs     : {Job3}
PSBeginTime   : 25/01/2016 15:06:22
PSEndTime     : 
PSJobTypeName : BackgroundJob

Есть ли какой-нибудь простой и надежный способ выяснить, какой процесс связан с этой работой (я думаю, это будет дополнительный powershell.exe)? Очевидно, что это легко в тестировании только с одной работой, но на сервере у меня может быть много таких одновременно.

Почему я хочу сделать / знать это?

Я нахожусь в новой роли, работая на сервере, который имеет несколько запланированных задач, выполняющих различные сценарии. Некоторые из них вызывают другие сценарии, которые мой предшественник выбрал для запуска с помощью Start-Job, возможно, потому что они могут работать долго (несколько часов) и хотели, чтобы они работали параллельно. Иногда кажется, что они застряли, и я хотел бы убить их, но не хочу рисковать, останавливая что-то еще здоровое.

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

2 ответа

Решение

Насколько я могу судить, ответ "могу ли я сказать, какой процесс соответствует каждой работе" - нет.

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

  1. У них есть командная строка, такая как:

    "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -Version 4.0 -s -NoLogo -NoProfile

  2. Они являются дочерними процессами другого процесса powershell.exe или powershell_ise.exe, в зависимости от того, как они вызываются. Если родительский процесс вызывается диспетчером задач или другим агентом планирования, существует вероятность того, что в командной строке процесса будет указано имя сценария, что может помочь. В моем случае это не слишком помогло, поскольку каждая запланированная задача порождала ~4 фоновых процесса powershell.exe.

  3. Если у вас есть детали того, когда было запущено каждое задание (легко, если вы можете запустить Get-Job командлет для возврата сведений о задании), вы могли бы сопоставлять задания с процессами на основе временных отметок, но даже в простых тестах не было точного соответствия; задание и процесс запускались на расстоянии 1-2 секунды.

Кроме этого, я не мог найти какой-либо полезный способ определить реальные процессы, связанные с каждой работой.

С использованием *-Job Командлеты могут быть лучшим подходом, чем возиться с реальными процессами. использование Get-Job перечислить существующие вакансии:

 PS C: \> Get-Job

Имя идентификатора PSJobTypeName   State       HasMoreData Расположение Команда
-   ----    -------------   -----       -----------   --------      -------
2    Job2    BackgroundJob Запуск False локального Do-Some
4 задание Job4    BackgroundJob завершено True          localhost     Get-Other 

Command Свойство содержит содержимое блока сценария, в котором выполняется задание.

(Get-Job -Id 2).Command

State Свойство показывает текущее состояние задания (выполняется, завершено, не удалось, заблокировано,...). HasMoreData свойство указывает, есть ли у задания вывод, который вы можете получить через Receive-Job,

Receive-Job -Id 4

Работа может быть остановлена ​​через Stop-Job, а также Remove-Job удаляет прерванные задания из списка заданий.

Смотрите здесь для получения дополнительной информации о фоновых заданиях.

Другие вопросы по тегам