我有一个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中工作人员使用的进程列表,
Process ID State Handles Start Time
---------- ----- ------- ----------
7124 Running
但我无法弄清楚如何实际捕获进程ID,以便我可以杀死它。
答案 0 :(得分:31)
如果进程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 }
答案 1 :(得分:13)
在服务器上的命令提示符中,我只是执行以下操作以获取正在运行的AppPool PID列表,以便我可以使用taskkill或任务管理器终止它们:
cd c:\windows\system32\inetsrv
appcmd list wp
taskkill /f /pid *PIDhere*
答案 2 :(得分:8)
(从罗马的评论中添加答案,因为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:无法从名称空间root / WebAdministration获取对象。无效的命名空间然后您需要使用以下命令启用 IIS管理脚本和工具功能:
ipmo ServerManager
Add-WindowsFeature Web-Scripting-Tools