Intentando iniciar el grupo de aplicaciones a través de Powershell Script: error intermitente

19

Tengo un script por lotes que me permite apagar un sitio, implementar archivos y volver a encender el sitio.

  1. Detener el grupo de aplicaciones: funciona
  2. Detener el sitio web - funciona
  3. Implementar archivos - funciona
  4. Iniciar grupo de aplicaciones: solo funciona a veces.
  5. Iniciar el sitio web: funciona si funciona anteriormente

Estoy ejecutando Windows Server 2012 R2, y el script por lotes es ejecutado por un tentáculo Octopus Deploy.

La línea en la que falla es:

 Start-WebAppPool -Name $appPoolName

Donde $ appPoolName es live.website.com

Esta línea funciona a veces pero no en otras, y no es consistente en ningún patrón.

Tengo el mismo script trabajando en otros servidores. He comprobado si el servicio de información de la aplicación se está ejecutando y si funciona correctamente. No hay registros del sistema en el visor de eventos.

Aunque, tengo este error de aplicación que se genera cuando se llama Start-WebAppPool:

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

¿Alguien sabe por qué esto puede estar sucediendo? He intentado escribir un bucle do-while hasta que esté en un estado "Iniciado", pero falla para siempre.

Actualizar

Resulta que el proceso no se detiene cuando apago el grupo de aplicaciones.

¿Por qué el proceso continuaría ejecutándose después de detener el grupo de aplicaciones? Literalmente continúa corriendo, sin parar.

¡Fijo!

Entonces, siguiendo los comentarios a continuación, cuando detengo el grupo de aplicaciones ahora me aseguro de que esté completamente en estado detenido antes de continuar el script.

Este es el script que tengo ahora y está funcionando completamente:

# 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" )
Base33
fuente
1
Me parece que está emitiendo el comando de detención del grupo de aplicaciones con éxito, pero en realidad no se detiene cuando intenta iniciarlo nuevamente. Probablemente porque el "proceso" que menciona en su edición lo mantiene en estado de ejecución (o tal vez en estado de "detención"), esperando que algo termine. ¿Es siempre el mismo proceso sosteniéndolo? ¿Cuál es ese proceso? (Proceso del sistema, o parte de su aplicación web, o ???). Si es un proceso que, aparte de su aplicación web, ¿por qué no depurarlo y descubrir qué está esperando (si es que hay algo)?
Ƭᴇcʜιᴇ007
1
Como un espacio intermedio, ¿quizás agregar código a su secuencia de comandos para esperar hasta que el grupo de aplicaciones esté realmente en un estado detenido antes de continuar en la secuencia de comandos?
Ƭᴇcʜιᴇ007
2
@ Base33, ¿puede pegar la respuesta en una respuesta y marcarla como la solución? Entonces esto ya no aparecerá como "sin respuesta"
HackSlash

Respuestas:

1

Octopus Deploy tiene algunos scripts de PowerShell de la comunidad, que puede encontrar aquí https://library.octopus.com/listing

Este es el contenido de uno de ellos, que tiene reintentos:

# 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 proviene de esta plantilla de biblioteca https://library.octopus.com/step-templates/3aaf34a5-90eb-4ea1-95db-15ec93c1e54d/actiontemplate-iis-apppool-stop

spikey_richie
fuente