尝试通过Powershell脚本启动应用程序池-间歇性出现错误


19

我有一个批处理脚本,该脚本可让我关闭网站,部署文件并重新打开网站。

  1. 停止应用程序池-工作
  2. 停止网站-工作
  3. 部署文件-工作
  4. 启动应用程序池-仅在某些时候有效!
  5. 启动网站-如果以前的作品有效

我正在运行Windows Server 2012 R2,并且批处理脚本由Octopus Deploy触手执行。

它失败的行是:

 Start-WebAppPool -Name $appPoolName

其中$ appPoolName是live.website.com

该行有时起作用,但其他行不起作用,并且在任何模式下都不一致。

我在其他服务器上使用相同的脚本。我检查了应用程序信息服务是否正在运行,并且运行正常。事件查看器中没有系统日志。

虽然,在调用Start-WebAppPool时出现此应用程序错误:

ERROR  + Start-WebAppPool -Name $appPoolName
ERROR  start-webitem : The service cannot accept control messages at this time. 

有人知道为什么会这样吗?我试图编写一个do-while循环,直到它处于“已启动”状态,但它永远循环失败。

更新资料

原来,当我关闭应用程序池时,该过程并未停止。

停止应用程序池后,为什么该过程将继续运行?它实际上会继续运行,而不会停止。

固定!

所以-按照下面的注释,当我停止应用程序池时,我现在确保在继续脚本之前它完全处于停止状态。

这是我现在拥有的脚本,可以正常运行:

# Load IIS module:
Import-Module WebAdministration

# Get AppPool Name
$appPoolName = $OctopusParameters['appPoolName']

if ( (Get-WebAppPoolState -Name $appPoolName).Value -eq "Stopped" )
{
    Write-Host "AppPool already stopped: " + $appPoolName
}
else
{
    Write-Host "Shutting down the AppPool: " + $appPoolName
    Write-Host (Get-WebAppPoolState $appPoolName).Value

# Signal to stop.
Stop-WebAppPool -Name $appPoolName
}

do
{
    Write-Host (Get-WebAppPoolState $appPoolName).Value
    Start-Sleep -Seconds 1
}
until ( (Get-WebAppPoolState -Name $appPoolName).Value -eq "Stopped" )

1
在我看来,您正在成功发出App Pool stop命令,但是在您尝试再次启动它时,它实际上并未停止。可能是因为您在编辑中提到的“过程”使它处于运行状态(或可能处于“停止”状态),从而等待完成。持有它的过程总是一样吗?那是什么过程?(系统进程,或Web应用程序的一部分,或???)。如果这是Web应用程序之外的一个过程,那为什么不调试它并弄清楚它正在等待什么(如果有的话)呢?
2015年

1
作为权宜之计,也许在脚本中添加代码以等待应用程序池实际上处于停止状态,然后再继续执行脚本?
2015年

2
@ Base33,可以将答案粘贴到答案中并标记为解决方案吗?然后,它将不再显示为“未答复”
HackSlash

Answers:


1

Octopus Deploy具有一些社区PowerShell脚本,您可以在这里找到https://library.octopus.com/listing

这是其中之一的内容,具有重试功能:

# Load IIS module:
Import-Module WebAdministration

# Get AppPool Name
$appPoolName = $OctopusParameters['appPoolName']
# Get the number of retries
$retries = $OctopusParameters['appPoolCheckRetries']
# Get the number of attempts
$delay = $OctopusParameters['appPoolCheckDelay']

# Check if exists
if(Test-Path IIS:\AppPools\$appPoolName) {

    # Stop App Pool if not already stopped
    if ((Get-WebAppPoolState $appPoolName).Value -ne "Stopped") {
        Write-Output "Stopping IIS app pool $appPoolName"
        Stop-WebAppPool $appPoolName

        $state = (Get-WebAppPoolState $appPoolName).Value
        $counter = 1

        # Wait for the app pool to the "Stopped" before proceeding
        do{
            $state = (Get-WebAppPoolState $appPoolName).Value
            Write-Output "$counter/$retries Waiting for IIS app pool $appPoolName to shut down completely. Current status: $state"
            $counter++
            Start-Sleep -Milliseconds $delay
        }
        while($state -ne "Stopped" -and $counter -le $retries)

        # Throw an error if the app pool is not stopped
        if($counter -gt $retries) {
            throw "Could not shut down IIS app pool $appPoolName. `nTry to increase the number of retries ($retries) or delay between attempts ($delay milliseconds)." }
    }
    else {
        Write-Output "$appPoolName already Stopped"
    }
}
else {
    Write-Output "IIS app pool $appPoolName doesn't exist"
}

来自此库模板https://library.octopus.com/step-templates/3aaf34a5-90eb-4ea1-95db-15ec93c1e54d/actiontemplate-iis-apppool-stop

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.