Как получить идентификатор рабочего процесса IIS AppPool - PullRequest
22 голосов
/ 10 августа 2011

У меня есть скрипт PowerShell, который запускается автоматически, когда наша служба мониторинга обнаруживает, что веб-сайт не работает. Он должен остановить AppPool (используя Stop-WebAppPool -name $AppPool;), подождать, пока он действительно остановится, а затем перезапустить его.

Иногда процесс фактически не останавливается, что проявляется в ошибке

Cannot Start Application Pool:  
The service cannot accept control messages at this time.
(Exception from HRESULT: 0x80070425)"

при попытке запустить его снова.

Если для остановки требуется больше определенного количества секунд (я выберу это количество времени после нескольких временных остановок, чтобы посмотреть, сколько времени это обычно занимает), я хочу просто завершить процесс.

Я знаю, что могу получить список процессов, используемых работниками в AppPool, выполнив dir IIS:\AppPools\MyAppPool\WorkerProcesses\,

Process ID  State      Handles  Start Time
----------  -----      -------  ----------
7124        Running

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

Ответы [ 3 ]

32 голосов
/ 10 августа 2011

Если идентификатор процесса действительно является идентификатором процесса, который нужно убить, вы можете:

$id = dir IIS:\AppPools\MyAppPool\WorkerProcesses\ | Select-Object -expand processId
Stop-Process -id $id

или

dir IIS:\AppPools\MyAppPool\WorkerProcesses\ | % { Stop-Process -id $_.processId }
13 голосов
/ 19 апреля 2013

В командной строке на сервере я просто делаю следующее для получения списка запущенных PID AppPool, чтобы можно было их убить с помощью Taskkill или Mgr задачи:

cd c:\windows\system32\inetsrv
appcmd list wp

taskkill /f /pid *PIDhere*
8 голосов
/ 10 декабря 2013

(Добавление ответа от комментария Романа, поскольку, возможно, проблемы с кешированием решения Stej)

Откройте Powershell в качестве администратора на веб-сервере, затем выполните:

gwmi -NS 'root\WebAdministration' -class 'WorkerProcess' | select AppPoolName,ProcessId 

Вы должны увидеть что-то вроде:

AppPoolName ProcessId
----------- ---------
AppPool_1        8020
AppPool_2        8568

Затем вы можете использовать диспетчер задач, чтобы убить его или использовать Powershell:

Stop-Process -Id xxxx

Если вы получаете Get-WmiObject: Не удалось получить объекты из корня пространства имен / WebAdministration. Неверное пространство имен , затем необходимо включить функцию Сценарии и инструменты управления IIS , используя:

ipmo ServerManager
Add-WindowsFeature Web-Scripting-Tools
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...