Azure启动任务挂起

4
我有一个Azure项目,其中包含一个MVC4角色,我已经添加了Visual C++ 2012 Runtime Library安装文件和一个脚本来静默安装它。
脚本可以正常工作并安装库,唯一的问题是任务永远不会完成,安装过程也永远不会退出,这将阻止角色启动: Role Instance 我使用远程桌面连接到服务器,并通过任务管理器查看进程vcredist_x64.exe:(实际上有两个,但我认为这是正常的)

Windows Server Task Manager

当我右键点击并结束进程时,部署成功并启动了角色。
当我的启动任务在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尝试在部署期间执行它时,它会挂起。
我的启动任务在ServiceDefinition.csdef中定义如下:
<Startup>
  <Task commandLine="InstallVcRedist.cmd" executionContext="elevated" taskType="background" />
</Startup>

C:\Resources\temp\{RoleId.RoleName}\RoleTemp中的日志显示一切都正常。

我可以通过将启动任务设置为后台而不是简单的方式来避免角色被阻止,但这并不能真正解决问题。谢谢。


你尝试过在RDP中手动运行它(不使用/quiet参数)吗?会发生什么?是否有错误? - user94559
我只是得到了一个对话框,其中我可以选择修复、卸载或关闭。只有当Azure在部署时尝试运行它时,该进程才会挂起,我会在这里尝试几件事情,看看会发生什么。 - Shahin Dohan
1
如果你使用/quiet运行它,我假设它会成功完成?你可以尝试使用psexec以本地系统用户身份运行。请参阅http://blog.smarx.com/posts/windows-azure-startup-tasks-tips-tricks-and-gotchas。 - user94559
是的,使用 /quiet 开关运行时正常退出。我尝试使用 psexec 以 SYSTEM 身份运行它,结果也很好。我将解决方案发布到另一个服务中,结果遇到了相同的问题。由于这显然对 Ram 可用,因此项目中必须存在错误配置。我在脚本中添加了 echo %ERRORLEVEL% >> c:\tasklog.txt 语句,但它没有创建文件。只有手动运行脚本时才会创建文件,这很奇怪。我会努力缩小问题范围。感谢迄今为止提供的帮助! - Shahin Dohan
我通过你链接的另一篇帖子看到了这篇文章,并阅读了你在底部关于将FamilyOS更改为2的说明,它起作用了!很高兴你指出了这一点,谢谢 :) - Shahin Dohan
2个回答

1

我通过 Steve Marx 的 这篇博客文章 找到了问题所在。

这个问题只会在 Windows Server 2008 SP2 上出现,所以我不得不将主机更改为 Windows Server 2008 R2
可以通过在所有的ServiceConfiguration文件中将osFamily="1"更改为osFamily="2"来完成此操作,或者可以从 Azure 门户中单击服务,然后在顶部选择配置 OS来进行更改。


0

我也需要使用这个库。 这是我的脚本:

start /w
cd startup
vcredist_x64.exe /q /norestart

exit /b 0

对我来说它正在工作 - 启动时我将vcredist_x64.exe放在哪里。

在我的服务定义文件中,这是XML行

 <Task commandLine="startup\InstallVcreditst.cmd" executionContext="elevated" taskType="simple" />

谢谢你的回答,但我们的脚本基本相同,除了 /w 开头只会生成一个命令行,而且它会阻止在云端进行安装,所以应该只在本地使用。 - Shahin Dohan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接