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


19

サイトをオフにし、ファイルを展開し、サイトをオンに戻すことができるバッチスクリプトがあります。

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

1
App Pool stopコマンドを正常に発行しているように聞こえますが、実際に再起動しようとしても停止していません。おそらく、編集で言及した「プロセス」が実行状態(または「停止」状態)に保持し、何かが終了するのを待っているためでしょう。それは常にそれを保持する同じプロセスですか?そのプロセスは何ですか?(システムプロセス、またはWebアプリの一部、または???)。それがあなたのウェブアプリとは別のプロセスであるなら、なぜそれをデバッグして、それが(もしあれば)何を待っているのかを理解してみませんか?
Ƭᴇcʜιᴇ007

1
ストップギャップとして、おそらくスクリプトにコードを追加して、アプリプールが実際に停止状態になるまで待ってからスクリプトを続行しますか?
Ƭᴇcʜιᴇ007

2
@ Base33、回答に回答を貼り付けて、解決策としてマークできますか?その後、これは「未回答」として表示されなくなります
-HackSlash

回答:


1

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からのもの

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.