Подтвердить что ты не робот

Как получить идентификатор рабочего процесса IIS AppPool

У меня есть PowerShell script, который запускается автоматически, когда наша служба мониторинга обнаруживает, что веб-сайт не работает. Он должен остановить 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

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

4b9b3361

Ответ 1

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

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

или

dir IIS:\AppPools\MyAppPool\WorkerProcesses\ | % { Stop-Process -id $_.processId }

Ответ 2

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

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

taskkill /f /pid *PIDhere*

Ответ 3

(добавление ответа из комментария Roman, поскольку могут возникнуть проблемы с кешем с решением 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: не удалось получить объекты из пространства имен root/WebAdministration. Недопустимое пространство имен, тогда вам нужно включить функцию IIS Management Scripts and Tools, используя:

ipmo ServerManager
Add-WindowsFeature Web-Scripting-Tools