web-dev-qa-db-ja.com

Powershellスクリプト経由でアプリプールを開始しようとしています-断続的にエラーが発生します

サイトをオフにしてファイルを展開し、サイトを再びオンにするバッチスクリプトがあります。

  1. アプリケーションプールを停止する-機能
  2. ウェブサイトを停止-機能
  3. ファイルのデプロイ-機能
  4. アプリケーションプールの開始-たまにしか機能しません!
  5. ウェブサイトを起動します-以前の作品が機能する場合は機能します

Windows Server 2012 R2を実行しています。バッチスクリプトはOctopus Deployの触手によって実行されます。

失敗している行は次のとおりです。

 Start-WebAppPool -Name $appPoolName

$ appPoolNameはlive.website.comです。

この行は時々機能しますが他の機能はしません、そしてどのパターンでも一貫していません。

他のサーバーで同じスクリプトを使用しています。アプリケーション情報サービスが実行されているかどうかを確認しましたが、正常に実行されています。イベントビューアにシステムログはありません。

ただし、Start-WebAppPoolが呼び出されたときに発生する次の1つのアプリケーションエラーがあります。

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" )
19
Base33

Octopus DeployにはいくつかのコミュニティPowerShellスクリプトがあり、ここで確認できます https://library.octopus.com/listing

これは、再試行するそれらの1つの内容です。

# 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

1
spikey_richie