Как получить идентификатор рабочего процесса 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
но я не могу понять, как реально захватить идентификатор процесса, чтобы я мог его убить.
Ответы
Ответ 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