如何获取IIS AppPool工作进程ID

nle07wnf  于 2023-11-19  发布在  其他
关注(0)|答案(4)|浏览(115)

我有一个PowerShell脚本,当我们的监控服务检测到网站关闭时,它会自动运行。它应该停止AppPool(使用Stop-WebAppPool -name $AppPool;),等到它真正停止,然后重新启动它。
有时它的过程实际上并没有停止,表现为错误

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

字符串
当你试图重新开始的时候。
如果停止所需的时间超过了一定的秒数(我会在多次停止后选择这个时间,看看通常需要多长时间),我想直接终止该进程。
我知道我可以通过执行dir IIS:\AppPools\MyAppPool\WorkerProcesses\来获取AppPool中的worker所使用的进程列表,

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


但是我不知道如何捕获进程id,这样我就可以杀死它。

3zwjbxry

3zwjbxry1#

如果进程ID实际上是要杀死的进程的ID,您可以:

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

字符串

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

lrpiutwd

lrpiutwd2#

在服务器上的命令提示符下,我只需执行以下操作即可获得正在运行的AppPool PID列表,以便使用taskkill或Task Kill杀死它们:

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

字符串

taskkill /f /pid *PIDhere*

uxhixvfz

uxhixvfz3#

(添加Roman评论中的答案,因为stej的解决方案可能存在缓存问题)
在Web服务器上以管理员身份打开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:Could not get objects from namespace root/WebAdministration. Invalid namespace,则需要使用以下命令启用IIS管理工具和工具功能:

ipmo ServerManager
Add-WindowsFeature Web-Scripting-Tools

w3nuxt5m

w3nuxt5m4#

我也遇到了同样的问题,以下是我的解决方案:

Get-WmiObject –class win32_process -filter 'name="w3wp.exe"' | Select-Object –Property Name, ProcessId, @{n='AppPool';e={$_.GetOwner().user}} | Where-Object {$_.AppPool -eq "WebsiteName"} | Select-Object -expand ProcessId

字符串

相关问题