У меня есть пакетный скрипт, который позволяет отключить сайт, развернуть файлы и снова включить сайт.
- Остановите пул приложений - работает
- Остановите сайт - работает
- Развернуть файлы - работает
- Запустите пул приложений - работает только иногда!
- Запустить сайт - работает, если предыдущие работы
Я использую 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" )