更新

更新

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

  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

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

相关内容