Попытка запустить пул приложений с помощью скрипта Powershell - периодически появляется ошибка

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. 

Кто-нибудь знает, почему это может происходить? Я пытался написать цикл 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" )
Base33
источник
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

spikey_richie
источник