Спроба запустити пул додатків через Powershell Script - помилка переривання


19

У мене є пакетний сценарій, який дозволяє мені вимкнути сайт, розгорнути файли та знову ввімкнути сайт.

  1. Зупинити пул додатків - працює
  2. Зупинити веб-сайт - працює
  3. Розгортання файлів - працює
  4. Запустити пул додатків - працює лише іноді!
  5. Запуск веб-сайту - працює, якщо попередні роботи

Я запускаю Windows Server 2012 R2, а пакетний сценарій виконується щупальцем Octopus Deploy.

Лінія, на яку вона провалюється, це:

 Start-WebAppPool -Name $appPoolName

Де $ appPoolName - live.website.com

Цей рядок працює іноді, але не для інших, і не відповідає жодній схемі.

У мене той самий сценарій, що працює на інших серверах. Я перевірив, чи працює служба інформації про додатки, і чи працює вона нормально. У переглядачі подій немає системних журналів.

Хоча, у мене є одна помилка програми, яка виникає, коли викликається Start-WebAppPool:

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

Хтось знає, чому це може статися? Я намагався записати цикл виконання часу, поки він не перебуває у "Початковому" стані, але цикл назавжди виходить з ладу.

Оновлення

Виявляється, процес не припиняється, коли я вимикаю пул програм.

Чому процес продовжуватиметься після зупинки пулу програм? Він буквально продовжує бігати, не зупиняючись.

Виправлено!

Отже - слідуючи коментарям нижче, коли я зупиняю пул додатків, я переконуюсь, що він повністю зупинений, перш ніж продовжувати сценарій.

Це сценарій, який я зараз маю і працює повністю:

# 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
Мені здається, що ви успішно видаєте команду зупинки пулу додатків, але насправді вона не зупиняється тим часом, коли ви намагаєтесь запустити її заново. Можливо, тому, що "процес", який ви згадуєте у своїй редакції, утримує його у запущеному стані (або, можливо, у стані "зупинки"), чекаючи, коли щось закінчиться. Чи завжди це той самий процес, який його тримає? Що це за процес? (Системний процес, або частина вашого веб-програми, або ???). Якщо це не ваш веб-додаток, то чому б не налагодити його і зрозуміти, що його чекає (якщо що)?
Ƭᴇcʜιᴇ007

1
Як, можливо, додайте код до свого сценарію, щоб зачекати, поки пул додатків фактично перестане перебувати, перш ніж продовжувати роботу в сценарії?
Ƭᴇcʜιᴇ007

2
@ Base33, чи можете ви вставити відповідь у відповідь і позначити як рішення? Тоді це більше не відображатиметься як "без відповіді"
HackSlash

Відповіді:


1

Octopus Deploy має кілька сценаріїв PowerShell спільноти, які ви можете знайти тут https://library.octopus.com/listing

Це вміст одного з них, який містить повторення:

# 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.