如何使启动任务具有幂等性?

Bri*_*chl 8 iis dos azure appcmd

我在批处理文件中有许多启动任务.特别是我调用IIS appcmd.exe来配置IIS.Azure中的启动任务应该是幂等的(即,能够以相同的结果重复运行),以防角色由于某种原因重新启动.不幸的是,我的许多IIS配置命令第二次都会失败,例如因为它们第一次删除配置节点,然后在后续运行中不存在.

我的问题是,如何使这些启动任务具有幂等性?有没有办法让appcmd.exe不抛出错误?有没有办法让shell捕获错误?有没有办法让Azure框架忽略错误?

这是我的启动任务的一个例子.这都包含在命令文件中configiis.cmd.

@REM Enable IIS compression for application/json MIME type
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/json',enabled='True']" /commit:apphost
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/json; charset=utf-8',enabled='True']" /commit:apphost

@REM Set IIS to automatically start AppPools
%windir%\system32\inetsrv\appcmd.exe set config -section:applicationPools -applicationPoolDefaults.startMode:AlwaysRunning /commit:apphost

@REM Set IIS to not shut down idle AppPools
%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeout:00:00:00 /commit:apphost

@REM But don't automatically start the AppPools that we don't use, and do shut them down when idle
%windir%\system32\inetsrv\appcmd.exe set config  -section:system.applicationHost/applicationPools "/[name='Classic .NET AppPool'].startMode:OnDemand" "/[name='Classic .NET AppPool'].autoStart:False" "/[name='Classic .NET AppPool'].processModel.idleTimeout:00:01:00" /commit:apphost
%windir%\system32\inetsrv\appcmd.exe set config  -section:system.applicationHost/applicationPools "/[name='ASP.NET v4.0'].startMode:OnDemand" "/[name='ASP.NET v4.0'].autoStart:False" "/[name='ASP.NET v4.0'].processModel.idleTimeout:00:01:00" /commit:apphost
%windir%\system32\inetsrv\appcmd.exe set config  -section:system.applicationHost/applicationPools "/[name='ASP.NET v4.0 Classic'].startMode:OnDemand" "/[name='ASP.NET v4.0 Classic'].autoStart:False" "/[name='ASP.NET v4.0 Classic'].processModel.idleTimeout:00:01:00" /commit:apphost


@REM remove IIS response headers
%windir%\system32\inetsrv\appcmd.exe set config /section:httpProtocol /-customHeaders.[name='X-Powered-By']
Run Code Online (Sandbox Code Playgroud)

Dav*_*gon 4

除了@Syntaxc4 的答案:考虑在本地使用面包屑(文件)。在您的脚本中,检查已知文件(您创建的)是否存在。如果它不存在,请检查启动脚本,同时创建一个面包屑文件。下次虚拟机启动时,它会再次检查面包屑文件是否存在,如果存在,则退出cmd文件。如果面包屑文件消失,这通常意味着您的虚拟机已在其他地方重建(新实例或重新生成的实例可能位于不同的硬件上),并且需要 IIS 配置。