我有一个具有MVC4角色的Azure项目,其中我添加了Visual C++ 2012 Runtime Library安装文件,以及一个静默安装它的脚本。
脚本工作并且库已安装,唯一的问题是任务永远不会完成,安装过程永远不会退出,然后阻止角色启动:
我使用远程桌面连接到服务器,通过查看任务管理器,我可以看到进程 vcredist_x64.exe :(其中2个实际上,但我认为这是正常的)
当我右键单击并终止该进程时,部署成功完成并且角色已启动。
当我的启动任务在 ServiceDefinition.csdef 中设置为简单时,这是一个问题,因为这会使服务器等到任务完成后才启动角色。所以我所做的是将任务设置为后台,这样启动脚本不会阻止角色启动,但即使这样,该过程仍然在后台运行并且必须被杀死手动。
此脚本应该可以使用,并且之前使用的是2010 VC ++库(虽然没有EXIT,但是如果脚本返回错误代码那么应该避免阻止该角色):
vcredist_x64.exe /quiet /norestart
EXIT /B 0
没有用,所以我想我会在安装后手动终止进程:
vcredist_x64.exe /quiet /norestart
TASKKILL /F /T /IM vcredist_x64.exe
EXIT /B 0
没有工作,过程还活着。如果我自己在服务器上或本地手动运行脚本,该脚本实际上有效,但是当Azure尝试在部署期间执行它时,它会挂起。
My Start-up任务在ServiceDefinition.csdef中定义如下:
<Startup>
<Task commandLine="InstallVcRedist.cmd" executionContext="elevated" taskType="background" />
</Startup>
C:\Resources\temp\{RoleId.RoleName}\RoleTemp
中的日志表示一切正常。
我可以通过将启动任务设置为后台而不是简单来避免阻止该角色,但这并不能解决问题。感谢。
答案 0 :(得分:1)
由于史蒂夫·马克思的this blog post,我弄清楚为什么会这样。
此问题仅发生在Windows Server 2008 SP2 中,因此我必须将主机更改为Windows Server 2008 R2 。
这可以通过在所有 ServiceConfiguration 文件中将osFamily="1"
更改为osFamily="2"
来完成,也可以通过单击服务然后配置从Azure门户更改它操作系统位于顶部。
答案 1 :(得分:0)
我也需要使用这个库。 这是我的剧本:
start /w
cd startup
vcredist_x64.exe /q /norestart
exit /b 0
它对我有用 - 启动是我保留vcredist_x64.exe的地方。
在我的servicedefinition文件中,这是xml行
<Task commandLine="startup\InstallVcreditst.cmd" executionContext="elevated" taskType="simple" />