如何用PowerShell在IIS响应缓慢时回收应用池?脚本报错求助
解决PowerShell应用池重启报错及脚本优化
首先说下你遇到的报错原因:你在Catch块里先执行了Stop-WebAppPool,紧接着又调用Restart-WebAppPool——但Restart-WebAppPool本身就包含了停止再启动的逻辑,当应用池已经被停止后,再调用重启命令就会触发这个"必须先启动已停止的对象才能重启"的错误,完全没必要多做一步Stop操作。
另外你的脚本还没实现10秒超时的需求,原来的[System.Net.WebRequest]默认超时可不是10秒,得手动设置。还有要注意如果请求超时进入Catch,$HTTP_Response会是null,直接调用Close()会报错,得加个判断。
下面是修改后的完整脚本,我标注了关键修改点:
# 加载IIS模块 Import-Module WebAdministration while ($true) { Write-Host 'Running For Check app.xxx.com ...' # 首先创建请求 $HTTP_Request = [System.Net.WebRequest]::Create('https://app.xxx.com/') # 新增:设置10秒超时(单位是毫秒) $HTTP_Request.Timeout = 10000 # 初始化响应对象为null,避免后续报错 $HTTP_Response = $null Try { # 获取站点响应 $HTTP_Response = $HTTP_Request.GetResponse() # 获取HTTP状态码整数 $HTTP_Status = [int]$HTTP_Response.StatusCode If ($HTTP_Status -eq 200) { Write-Host "Site is OK!" } Else { Write-Host "The Site returned non-200 status code, restarting app pool..." Restart-WebAppPool -Name "app.xxx.com" } } Catch { Write-Host "Request timed out or failed, restarting app pool..." # 移除多余的Stop-WebAppPool,直接调用重启即可 Restart-WebAppPool -Name "app.xxx.com" } # 新增:判断响应对象不为null时再关闭连接 if ($HTTP_Response) { $HTTP_Response.Close() } Start-Sleep -Seconds 120 }
关键修改说明:
- 移除了
Catch块里的Stop-WebAppPool,用Restart-WebAppPool单独处理即可,它会自动处理应用池的停止和重启流程 - 添加了
$HTTP_Request.Timeout = 10000,实现10秒超时的需求 - 初始化
$HTTP_Response = $null,并在关闭前判断对象是否存在,避免请求失败时调用Close()报错 - 优化了日志输出,让你能更清楚知道触发重启的原因
这样修改后,既解决了重启报错的问题,也完整实现了你最初的需求:10秒超时或非200状态码时自动重启应用池。
内容的提问来源于stack exchange,提问作者Penguen
相关产品推荐
相关产品推荐

