Назад | Перейти на главную страницу

PsExec периодически зависает при вызове AppCmd

У нас есть автоматизированный процесс развертывания, который в основном управляется пакетным файлом. Одним из первых шагов в этом процессе является остановка пула приложений IIS, чтобы можно было безопасно скопировать обновленные файлы. Для этого мы вызываем PsExec, например:

PsExec.exe -accepteula %WEB_SERVER_MACHINE_NAME% cmd /c %%systemroot%%\system32\inetsrv\AppCmd.exe stop apppool /apppool.name:"%APP_POOL_NAME%" 2>&1

Где находятся переменные среды (это не фактические значения, просто для иллюстрации):

Весь процесс развертывания обычно занимает всего несколько минут. Однако кажется, что иногда, казалось бы, случайно, этот процесс застревает на этом шаге и, кажется, ждет бесконечно долго. Если я проверю веб-сервер во время этого процесса, AppPool не останавливается, и остановка вручную AppPool не имеет никакого эффекта. Необходимо развернуть 6 различных сайтов, и это может произойти на любом из сайтов.

Я также пробовал отключить автозапуск вот так:

PsExec.exe -accepteula %WEB_SERVER_MACHINE_NAME% cmd /c %%systemroot%%\system32\inetsrv\AppCmd.exe set apppool /apppool.name:"%APP_POOL_NAME%" /autoStart:false 2>&1

И иногда, но иногда кажется, что на этом этапе он останавливается. Итак, похоже, проблема с PsExec скорее, чем AppCmd. Я также попытался указать тайм-аут подключения к PsExec а также цепочку выхода в конце cmd звоните, вот так:

PsExec.exe -accepteula -n 60 %WEB_SERVER_MACHINE_NAME% cmd /c %%systemroot%%\system32\inetsrv\AppCmd.exe stop apppool /apppool.name:"%APP_POOL_NAME%" ^& exit 0 2>&1

Кто-нибудь сталкивался с этой проблемой раньше? Что могло вызвать это PsExec звонить с перерывами?

Использование WMIC кажется более надежным (хотя и не идеальным). Вот что я в итоге использовал:

wmic /node:"%WEB_SERVER_MACHINE_NAME%" /namespace:\\root\WebAdministration path ApplicationPool where name='%APP_POOL_NAME%' call start

wmic /node:"%WEB_SERVER_MACHINE_NAME%" /namespace:\\root\WebAdministration path ApplicationPool where name='%APP_POOL_NAME%' set AutoStart=true