Tentando iniciar o pool de aplicativos via Powershell Script - obtendo erro intermitentemente


19

Eu tenho um script em lote que permite desativar um site, implantar arquivos e ativá-lo novamente.

  1. Interromper o pool de aplicativos - funciona
  2. Pare o site - funciona
  3. Implantar arquivos - obras
  4. Iniciar Pool de Aplicativos - funciona apenas algumas vezes!
  5. Iniciar o site - funciona se trabalhos anteriores

Estou executando o Windows Server 2012 R2 e o script em lote é executado por um tentáculo do Octopus Deploy.

A linha em que está falhando é:

 Start-WebAppPool -Name $appPoolName

Onde $ appPoolName é live.website.com

Essa linha funciona algumas vezes, mas não outras, e não é consistente em nenhum padrão.

Eu tenho o mesmo script trabalhando em outros servidores. Eu verifiquei se o serviço de Informações do Aplicativo está sendo executado e está sendo executado corretamente. Não há logs do sistema no visualizador de eventos.

Embora eu tenha esse erro de aplicativo gerado quando o Start-WebAppPool é chamado:

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

Alguém sabe por que isso pode estar acontecendo? Eu tentei escrever um loop do-while até que ele estivesse no estado "Iniciado", mas ele repetiu para sempre.

Atualizar

Acontece que o processo não está parando quando eu desativo o pool de aplicativos.

Por que o processo continuaria em execução após a interrupção do pool de aplicativos? Ele literalmente continua funcionando, sem parar.

Fixo!

Então - seguindo os comentários abaixo, quando paro o pool de aplicativos, agora eu asseguro que ele esteja completamente no estado parado antes de continuar o script.

Este é o script que eu tenho agora e está funcionando perfeitamente:

# 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
Parece-me que você está emitindo o comando stop do pool de aplicativos com êxito, mas na verdade não é interrompido quando você tenta iniciá-lo novamente. Provavelmente porque o "processo" que você mencionou na sua edição está mantendo-o em um estado de execução (ou talvez no estado "de parada"), aguardando a conclusão de algo. É sempre o mesmo processo que o mantém? O que é esse processo? (Processo do sistema ou parte do seu aplicativo da web ou ???). Se é um processo que faz parte do seu aplicativo da Web, por que não depurá-lo e descobrir o que está esperando (se houver)?
Ƭᴇcʜιᴇ007

1
Como uma lacuna, talvez adicione código ao seu script para aguardar até que o pool de aplicativos esteja realmente parado antes de continuar no script?
precisa saber é o seguinte

2
@ Base33, você pode colar a resposta em uma resposta e marcar como solução? Então isso não vai mais aparecer como "sem resposta"
HackSlash

Respostas:


1

O Octopus Deploy possui alguns scripts da comunidade do PowerShell, que você pode encontrar aqui https://library.octopus.com/listing

Este é o conteúdo de um deles, que tem novas tentativas:

# 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"
}

Que vem deste modelo de biblioteca https://library.octopus.com/step-templates/3aaf34a5-90eb-4ea1-95db-15ec93c1e54d/actiontemplate-iis-apppool-stop

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.