【问题标题】:Azure: How to execute a startup task delayed?Azure:如何延迟执行启动任务?
【发布时间】:2011-11-27 16:35:04
【问题描述】:

我的 WebRole 中有两个站点,并定义了一个启动任务。

第一行运行良好,它为我创建了一个新的应用程序池:

%WINDIR%\system32\inetsrv\appcmd.exe add apppool /name:"VCPool" /managedRuntimeVersion:"v4.0" /managedPipelineMode:"Integrated"

现在我想将我的第二个更改为这个新创建的 AppPool,但之后添加另一行并没有帮助。

%WINDIR%\system32\inetsrv\appcmd.exe set app "WebRole_IN_0_VC/" /applicationPool:"VCPool"

似乎第二个站点还没有准备好。

如何将我的任务延迟 30 秒或稍微延迟 appcmd.exe? 除非有一种方法可以为这个启动任务创建依赖关系,它只能在第二个站点启动并运行时执行?

任何帮助将不胜感激, 非常感谢,

有没有办法将此执行延迟 30 秒,以确保第二个站点已启动并且可以更改?

更新:

感谢您的提示。我已对此事进行了进一步调查。我找到了 OnStart() 事件。

1) 但由于我使用的是 silverlight 并且只是将现有的 Web 项目包装在 Cloud Roles 项目中,所以我不会有这样的 WebRole.cs。我可以将它添加到我的 Silverlight Web 项目中并在那里使用它吗?还是建议从头开始创建一个 WebRole 项目,并使其完全取代 Silverlight Web 项目?

2) 关于服务定义中的<Runtime/>标签,我是不是就这么简单地添加?当 webrole 运行提升时,它是否会产生任何安全隐患?

<WebRole name="WebRole" enableNativeCodeExecution="true" vmsize="ExtraSmall">
    <Runtime executionContext="elevated"/>
    <Sites>
      <Site name="WebRole" physicalDirectory="./WebRole">
      ...
    </Sites>
</WebRole>

3) 最后但并非最不重要的一点是,我如何运行 cmd 文件或者实际上是这一行

%WINDIR%\system32\inetsrv\appcmd.exe set site /site.name:"WebRole_IN_0_VC" /[Path='/'].applicationPool:"ASP.NET v4.0" >>Log.txt

在 OnStart() 方法中?

【问题讨论】:

    标签: iis azure azure-web-roles appcmd azure-configuration


    【解决方案1】:

    您能否探索使用 PowerShell 脚本来执行这些任务。 PowerShell 有办法让线程休眠。类似的东西

    批处理文件

    %WINDIR%\system32\inetsrv\appcmd.exe add apppool /name:"VCPool" /managedRuntimeVersion:"v4.0" /managedPipelineMode:"Integrated"
    powershell -command "Set-ExecutionPolicy Unrestricted" 2>> err.out 
    powershell .\sleep.ps1 2>> err.out
    %WINDIR%\system32\inetsrv\appcmd.exe set app "WebRole_IN_0_VC/" /applicationPool:"VCPool"
    

    我没有尝试过,但它应该可以工作。请参阅此post 以了解 Powershell 集成。

    【讨论】:

    • 感谢您的回复,所以当我将 powershell .\sleep.ps1 2>> err.out 放在那里时,我是否必须使用以下行填充 sleep.ps1: Start-Sleep -s 30 ?但是,问题仍然存在,如果在执行任务之后创建 ,则将这个任务作为后台运行并延迟 30 秒会有所帮助......
    • sleep.ps1 将包含与延迟相关的代码。您是对的,即使您将其作为后台任务运行,您也无法确定是否已经创建了第二个站点。如果 Powershell 允许类似 appcmd.exe 的功能。您可以使用它构建重试直到成功机制。
    【解决方案2】:

    如您所见,该站点是在“任务”部分运行后创建的。相反,从“OnStart”事件运行您的代码。该站点将在那时创建。你可能需要更新你的服务定义文件来运行你的角色'提升'这可以通过添加这个标签来完成:

    <Runtime executionContext="elevated"/>
    

    已编辑

    回答您的其他问题:

    1) 无论您有什么项目,您都应该能够添加 RoleEntryPoint 类。您可能必须手动执行此操作。

    2) 添加运行时标签不会给您的部署增加任何重大风险。

    3) 创建一个 cmd 文件以将您的命令放入(即 OnStart.cmd)并使用如下代码:

    System.Diagnostics.Process.Start("OnStart.cmd")
    

    在此处启动进程的更多信息:http://msdn.microsoft.com/en-us/library/53ezey2s.aspx

    【讨论】:

    • 所以任务部分在站点创建之前运行?那是个坏消息。所以延迟将不起作用。当您说“OnStart”事件时,您是指在 ServiceDefinition 文件中吗?我认为您的帖子在中间被砍掉了。
    • OnStart 是您应该在实现 RoleEntryPoint 的类中重写的方法(通常是 WorkerRole 或 WebRole)。
    • 嗨,Richard,你是对的,这些任务在站点生成之前就已经真正执行了。我现在可以在日志文件中看到它。看来您的解决方案可能是最可靠的。我什至联系了 Microsoft Azure 支持,但到目前为止他们无法帮助我。如果您能阅读我在问题中更新的部分并为我进一步澄清,我将不胜感激。高度赞赏
    • 嗨@Kave,我添加了一些额外的答案。我希望这会有所帮助
    • 感谢理查德的所有帮助。由于我使用的是 PHPAzure,后者又从 PHP 文件创建 Azure 包,因此我无法真正控制覆盖任何内容。我的 Silverlight Web 项目只是发布到一个文件夹中。我将此文件夹的路径添加到第二个站点的物理路径。如果创建包是从 VS 驱动的,那将没有问题,您的解决方案也会奏效。就我而言,不幸的是它没有。我不得不采取一种将后台任务延迟 90 秒的骇人听闻的方式。我希望有更好的方法...
    【解决方案3】:

    对于那些感兴趣的... .exe。

    更多信息:http://mvolo.com/configure-iis-websites-windows-azure-startup-tasks-appcmd/

    谢谢, 迈克

    【讨论】:

    • 您应该将博客中的相关部分复制并粘贴到此答案中。没有这个,你的答案是没有用的。当此链接失效时,您的答案将变得毫无用处。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 2013-11-11
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多