我们有一个自动部署过程,主要由批处理文件管理。该过程的第一步是停止 IIS AppPool,以便可以安全地复制更新的文件。为此,我们调用 PsExec,如下所示:
PsExec.exe -accepteula %WEB_SERVER_MACHINE_NAME% cmd /c %%systemroot%%\system32\inetsrv\AppCmd.exe stop apppool /apppool.name:"%APP_POOL_NAME%" 2>&1
环境变量的位置(这些不是实际值,仅用于说明):
WEB_SERVER_MACHINE_NAME=\\WEBSERVER01
APP_POOL_NAME=APP01
整个部署过程通常只需几分钟。但是,有时,这个过程似乎随机地卡在这一步,似乎无限期地等待。如果我在此过程中检查 Web 服务器,它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
呼叫间歇性停止?
答案1
使用 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