Der Versuch, den App-Pool über Powershell Script zu starten, wird zeitweise angezeigt


19

Ich habe ein Batch-Skript, mit dem ich eine Site deaktivieren, Dateien bereitstellen und die Site wieder aktivieren kann.

  1. Stoppen Sie den Anwendungspool - funktioniert
  2. Stoppen Sie die Website - funktioniert
  3. Dateien bereitstellen - funktioniert
  4. Anwendungspool starten - funktioniert nur manchmal!
  5. Starten Sie die Website - funktioniert, wenn vorherige funktioniert

Ich verwende Windows Server 2012 R2 und das Batch-Skript wird von einem Octopus Deploy-Tentakel ausgeführt.

Die Zeile, in der es fehlschlägt, lautet:

 Start-WebAppPool -Name $appPoolName

Wobei $ appPoolName live.website.com ist

Diese Linie funktioniert manchmal, aber nicht bei anderen und ist in keinem Muster konsistent.

Ich habe das gleiche Skript auf anderen Servern. Ich habe überprüft, ob der Anwendungsinformationsdienst ausgeführt wird und ob er ordnungsgemäß ausgeführt wird. In der Ereignisanzeige sind keine Systemprotokolle vorhanden.

Obwohl ich diesen einen Anwendungsfehler habe, der ausgelöst wird, wenn der Start-WebAppPool aufgerufen wird:

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

Weiß jemand, warum dies passieren kann? Ich habe versucht, eine Do-While-Schleife zu schreiben, bis sie sich in einem "Started" -Zustand befindet, aber die Schleife schlägt für immer fehl.

Aktualisieren

Es stellt sich heraus, dass der Prozess nicht stoppt, wenn ich den Anwendungspool ausschalte.

Warum sollte der Prozess nach dem Stoppen des Anwendungspools weiter ausgeführt werden? Es läuft buchstäblich weiter, ohne anzuhalten.

Fest!

Wenn ich also den Kommentaren unten folge, stelle ich beim Beenden des Anwendungspools jetzt sicher, dass er vollständig gestoppt ist, bevor ich mit dem Skript fortfahre.

Dies ist das Skript, das ich jetzt habe und das voll funktioniert:

# 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
Klingt für mich so, als würden Sie den Befehl zum Beenden des App-Pools erfolgreich ausgeben, aber er wird nicht tatsächlich gestoppt, wenn Sie versuchen, ihn erneut zu starten. Wahrscheinlich, weil der "Prozess", den Sie in Ihrer Bearbeitung erwähnen, ihn in einem laufenden Zustand (oder vielleicht in einem "Stopp" -Zustand) hält und darauf wartet, dass etwas beendet wird. Ist es immer der gleiche Prozess, der es hält? Was ist das für ein Prozess? (Systemprozess oder Teil Ihrer Web-App oder ???). Wenn es sich um einen Prozess handelt, der von Ihrer Web-App getrennt ist, warum nicht debuggen und herausfinden, worauf er wartet (wenn überhaupt)?
Ƭᴇcʜιᴇ007

1
Fügen Sie Ihrem Skript möglicherweise Code hinzu, um zu warten, bis der App-Pool tatsächlich gestoppt ist, bevor Sie mit dem Skript fortfahren.
Ƭᴇcʜιᴇ007

2
@ Base33, kannst du die Antwort in eine Antwort einfügen und als Lösung markieren? Dann wird dies nicht mehr als "unbeantwortet"
angezeigt

Antworten:


1

Octopus Deploy verfügt über einige PowerShell-Community-Skripts, die Sie hier finden: https://library.octopus.com/listing

Dies ist der Inhalt eines von ihnen, der wiederholt hat:

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

Welches kommt von dieser Bibliotheksvorlage https://library.octopus.com/step-templates/3aaf34a5-90eb-4ea1-95db-15ec93c1e54d/actiontemplate-iis-apppool-stop

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.