Как узнать, какие процессы запускаются командой 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 ответа
Насколько я могу судить, ответ "могу ли я сказать, какой процесс соответствует каждой работе" - нет.
Тем не менее, кажется, что есть некоторые подсказки относительно того, какие процессы совпадают с заданиями.
У них есть командная строка, такая как:
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -Version 4.0 -s -NoLogo -NoProfile
Они являются дочерними процессами другого процесса powershell.exe или powershell_ise.exe, в зависимости от того, как они вызываются. Если родительский процесс вызывается диспетчером задач или другим агентом планирования, существует вероятность того, что в командной строке процесса будет указано имя сценария, что может помочь. В моем случае это не слишком помогло, поскольку каждая запланированная задача порождала ~4 фоновых процесса powershell.exe.
Если у вас есть детали того, когда было запущено каждое задание (легко, если вы можете запустить
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
удаляет прерванные задания из списка заданий.
Смотрите здесь для получения дополнительной информации о фоновых заданиях.