サイトをオフにしてファイルを展開し、サイトを再びオンにするバッチスクリプトがあります。
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" )
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