Tarefas de arranque do Common Cloud Service (clássico)

Importante

Serviços Cloud (clássico) é agora preterido para novos clientes e será descontinuado a 31 de agosto de 2024 para todos os clientes. As novas implementações devem utilizar o novo modelo de implementação baseado em Resource Manager do Azure Serviços Cloud (suporte alargado).

Este artigo fornece alguns exemplos de tarefas de arranque comuns que poderá querer realizar no seu serviço cloud. Pode utilizar tarefas de arranque para efetuar operações antes de iniciar uma função. As operações que poderá querer executar incluem a instalação de um componente, o registo de componentes COM, a definição de chaves de registo ou o início de um processo de execução prolongada.

Veja este artigo para compreender como funcionam as tarefas de arranque e, especificamente, como criar as entradas que definem uma tarefa de arranque.

Nota

As tarefas de arranque não são aplicáveis a Máquinas Virtuais, apenas às funções Web e de Trabalho do Serviço Cloud.

Definir variáveis de ambiente antes do início de uma função

Se precisar de variáveis de ambiente definidas para uma tarefa específica, utilize o elemento Ambiente dentro do elemento Tarefa .

<ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
    <WorkerRole name="WorkerRole1">
        ...
        <Startup>
            <Task commandLine="Startup.cmd" executionContext="limited" taskType="simple">
                <Environment>
                    <Variable name="MyEnvironmentVariable" value="MyVariableValue" />
                </Environment>
            </Task>
        </Startup>
    </WorkerRole>
</ServiceDefinition>

As variáveis também podem utilizar um valor do Azure XPath válido para referenciar algo sobre a implementação. Em vez de utilizar o value atributo, defina um elemento subordinado RoleInstanceValue .

<Variable name="PathToStartupStorage">
    <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/LocalResources/LocalResource[@name='StartupLocalStorage']/@path" />
</Variable>

Configurar o arranque do IIS com AppCmd.exe

A ferramenta de linha de comandosAppCmd.exepode ser utilizada para gerir as definições do IIS no arranque no Azure. AppCmd.exe fornece acesso conveniente e de linha de comandos às definições de configuração para utilização em tarefas de arranque no Azure. Ao utilizar AppCmd.exe, as definições do Site podem ser adicionadas, modificadas ou removidas para aplicações e sites.

No entanto, existem alguns aspetos a ter em conta na utilização de AppCmd.exe como uma tarefa de arranque:

  • As tarefas de arranque podem ser executadas mais do que uma vez entre reinícios. Por exemplo, quando uma função é reciclada.
  • Se uma açãoAppCmd.exe for executada mais do que uma vez, poderá gerar um erro. Por exemplo, tentar adicionar uma secção a Web.config duas vezes pode gerar um erro.
  • As tarefas de arranque falham se devolverem um código de saída ou um nível de erro não zero. Por exemplo, quando AppCmd.exe gera um erro.

É uma boa prática verificar o nível de erro depois de chamar AppCmd.exe, o que é fácil de fazer se encapsular a chamada para AppCmd.exe com um ficheiro .cmd . Se detetar uma resposta de nível de erro conhecida, pode ignorá-la ou passá-la de volta.

O nível de erro devolvido pelo AppCmd.exe está listado no ficheiro winerror.h e também pode ser visto no MSDN.

Exemplo de gestão do nível de erro

Este exemplo adiciona uma secção de compressão e uma entrada de compressão para JSON ao ficheiro Web.config , com processamento e registo de erros.

As secções relevantes do ficheiro ServiceDefinition.csdef são apresentadas aqui, que incluem a definição do atributo executionContext para elevated dar AppCmd.exe permissões suficientes para alterar as definições no ficheiro Web.config :

<ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
    <WorkerRole name="WorkerRole1">
        ...
        <Startup>
            <Task commandLine="Startup.cmd" executionContext="elevated" taskType="simple" />
        </Startup>
    </WorkerRole>
</ServiceDefinition>

O ficheiro batch Startup.cmd utiliza AppCmd.exe para adicionar uma secção de compressão e uma entrada de compressão para JSON ao ficheiro Web.config . O nível de erro esperado de 183 está definido como zero com o programa de linha de comandos VERIFY.EXE. Os níveis de erro inesperados são registados no StartupErrorLog.txt.

REM   *** Add a compression section to the Web.config file. ***
%windir%\system32\inetsrv\appcmd set config /section:urlCompression /doDynamicCompression:True /commit:apphost >> "%TEMP%\StartupLog.txt" 2>&1

REM   ERRORLEVEL 183 occurs when trying to add a section that already exists. This error is expected if this
REM   batch file were executed twice. This can occur and must be accounted for in an Azure startup
REM   task. To handle this situation, set the ERRORLEVEL to zero by using the Verify command. The Verify
REM   command will safely set the ERRORLEVEL to zero.
IF %ERRORLEVEL% EQU 183 VERIFY > NUL

REM   If the ERRORLEVEL is not zero at this point, some other error occurred.
IF %ERRORLEVEL% NEQ 0 (
    ECHO Error adding a compression section to the Web.config file. >> "%TEMP%\StartupLog.txt" 2>&1
    GOTO ErrorExit
)

REM   *** Add compression for json. ***
%windir%\system32\inetsrv\appcmd set config  -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/json; charset=utf-8',enabled='True']" /commit:apphost >> "%TEMP%\StartupLog.txt" 2>&1
IF %ERRORLEVEL% EQU 183 VERIFY > NUL
IF %ERRORLEVEL% NEQ 0 (
    ECHO Error adding the JSON compression type to the Web.config file. >> "%TEMP%\StartupLog.txt" 2>&1
    GOTO ErrorExit
)

REM   *** Exit batch file. ***
EXIT /b 0

REM   *** Log error and exit ***
:ErrorExit
REM   Report the date, time, and ERRORLEVEL of the error.
DATE /T >> "%TEMP%\StartupLog.txt" 2>&1
TIME /T >> "%TEMP%\StartupLog.txt" 2>&1
ECHO An error occurred during startup. ERRORLEVEL = %ERRORLEVEL% >> "%TEMP%\StartupLog.txt" 2>&1
EXIT %ERRORLEVEL%

Adicionar regras de firewall

No Azure, existem efetivamente duas firewalls. A primeira firewall controla as ligações entre a máquina virtual e o mundo exterior. Esta firewall é controlada pelo elemento EndPoints no ficheiro ServiceDefinition.csdef .

A segunda firewall controla as ligações entre a máquina virtual e os processos nessa máquina virtual. Esta firewall pode ser controlada pela netsh advfirewall firewall ferramenta de linha de comandos.

O Azure cria regras de firewall para os processos iniciados nas suas funções. Por exemplo, quando inicia um serviço ou programa, o Azure cria automaticamente as regras de firewall necessárias para permitir que esse serviço comunique com a Internet. No entanto, se criar um serviço iniciado por um processo fora da sua função (como um serviço COM+ ou uma Tarefa Agendada do Windows), terá de criar manualmente uma regra de firewall para permitir o acesso a esse serviço. Estas regras de firewall podem ser criadas com uma tarefa de arranque.

Uma tarefa de arranque que crie uma regra de firewall tem de ter um executionContext de elevado. Adicione a seguinte tarefa de arranque ao ficheiro ServiceDefinition.csdef .

<ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
    <WorkerRole name="WorkerRole1">
        ...
        <Startup>
            <Task commandLine="AddFirewallRules.cmd" executionContext="elevated" taskType="simple" />
        </Startup>
    </WorkerRole>
</ServiceDefinition>

Para adicionar a regra de firewall, tem de utilizar os comandos adequados netsh advfirewall firewall no ficheiro de lote de arranque. Neste exemplo, a tarefa de arranque requer segurança e encriptação para a porta TCP 80.

REM   Add a firewall rule in a startup task.

REM   Add an inbound rule requiring security and encryption for TCP port 80 traffic.
netsh advfirewall firewall add rule name="Require Encryption for Inbound TCP/80" protocol=TCP dir=in localport=80 security=authdynenc action=allow >> "%TEMP%\StartupLog.txt" 2>&1

REM   If an error occurred, return the errorlevel.
EXIT /B %errorlevel%

Bloquear um endereço IP específico

Pode restringir o acesso de uma função Web do Azure a um conjunto de endereços IP especificados ao modificar o ficheiro deweb.config do IIS. Também tem de utilizar um ficheiro de comando que desbloqueie a secção ipSecurity do ficheiro ApplicationHost.config .

Para desbloquear a secção ipSecurity do ficheiro ApplicationHost.config , crie um ficheiro de comando que seja executado no início da função. Crie uma pasta ao nível raiz da sua função Web denominada arranque e, nesta pasta, crie um ficheiro batch denominado startup.cmd. Adicione este ficheiro ao seu projeto do Visual Studio e defina as propriedades como Copiar Sempre para garantir que está incluído no seu pacote.

Adicione a seguinte tarefa de arranque ao ficheiro ServiceDefinition.csdef .

<ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
    <WebRole name="WebRole1">
        ...
        <Startup>
            <Task commandLine="startup.cmd" executionContext="elevated" />
        </Startup>
    </WebRole>
</ServiceDefinition>

Adicione este comando ao ficheiro startup.cmd :

@echo off
@echo Installing "IPv4 Address and Domain Restrictions" feature 
powershell -ExecutionPolicy Unrestricted -command "Install-WindowsFeature Web-IP-Security"
@echo Unlocking configuration for "IPv4 Address and Domain Restrictions" feature 
%windir%\system32\inetsrv\AppCmd.exe unlock config -section:system.webServer/security/ipSecurity

Esta tarefa faz com que o ficheiro batch startup.cmd seja executado sempre que a função Web é inicializada, garantindo que a secção ipSecurity necessária é desbloqueada.

Por fim, modifique a secção system.webServer do ficheiro web.config da sua função Web para adicionar uma lista de endereços IP aos quais é concedido acesso, conforme mostrado no exemplo seguinte:

Esta configuração de exemplo permite que todos os IPs acedam ao servidor, exceto os dois definidos

<system.webServer>
    <security>
    <!--Unlisted IP addresses are granted access-->
    <ipSecurity>
        <!--The following IP addresses are denied access-->
        <add allowed="false" ipAddress="192.168.100.1" subnetMask="255.255.0.0" />
        <add allowed="false" ipAddress="192.168.100.2" subnetMask="255.255.0.0" />
    </ipSecurity>
    </security>
</system.webServer>

Esta configuração de exemplo nega que todos os IPs acedam ao servidor, exceto os dois definidos.

<system.webServer>
    <security>
    <!--Unlisted IP addresses are denied access-->
    <ipSecurity allowUnlisted="false">
        <!--The following IP addresses are granted access-->
        <add allowed="true" ipAddress="192.168.100.1" subnetMask="255.255.0.0" />
        <add allowed="true" ipAddress="192.168.100.2" subnetMask="255.255.0.0" />
    </ipSecurity>
    </security>
</system.webServer>

Criar uma tarefa de arranque do PowerShell

Windows PowerShell scripts não podem ser chamados diretamente a partir do ficheiro ServiceDefinition.csdef, mas podem ser invocados a partir de um ficheiro de lote de arranque.

O PowerShell (por predefinição) não executa scripts não assinados. A menos que assine o script, tem de configurar o PowerShell para executar scripts não assinados. Para executar scripts não assinados, a ExecutionPolicy tem de ser definida como Sem Restrições. A definição ExecutionPolicy que utiliza baseia-se na versão do Windows PowerShell.

REM   Run an unsigned PowerShell script and log the output
PowerShell -ExecutionPolicy Unrestricted .\startup.ps1 >> "%TEMP%\StartupLog.txt" 2>&1

REM   If an error occurred, return the errorlevel.
EXIT /B %errorlevel%

Se estiver a utilizar um SO Convidado que execute o PowerShell 2.0 ou 1.0, pode forçar a execução da versão 2 e, se não estiver disponível, utilize a versão 1.

REM   Attempt to set the execution policy by using PowerShell version 2.0 syntax.
PowerShell -Version 2.0 -ExecutionPolicy Unrestricted .\startup.ps1 >> "%TEMP%\StartupLog.txt" 2>&1

REM   If PowerShell version 2.0 isn't available. Set the execution policy by using the PowerShell
IF %ERRORLEVEL% EQU -393216 (
   PowerShell -Command "Set-ExecutionPolicy Unrestricted" >> "%TEMP%\StartupLog.txt" 2>&1
   PowerShell .\startup.ps1 >> "%TEMP%\StartupLog.txt" 2>&1
)

REM   If an error occurred, return the errorlevel.
EXIT /B %errorlevel%

Criar ficheiros no armazenamento local a partir de uma tarefa de arranque

Pode utilizar um recurso de armazenamento local para armazenar ficheiros criados pela sua tarefa de arranque que são acedidos mais tarde pela sua aplicação.

Para criar o recurso de armazenamento local, adicione uma secção LocalResources ao ficheiro ServiceDefinition.csdef e, em seguida, adicione o elemento subordinado LocalStorage . Atribua ao recurso de armazenamento local um nome exclusivo e um tamanho adequado para a tarefa de arranque.

Para utilizar um recurso de armazenamento local na sua tarefa de arranque, tem de criar uma variável de ambiente para referenciar a localização do recurso de armazenamento local. Em seguida, a tarefa de arranque e a aplicação podem ler e escrever ficheiros no recurso de armazenamento local.

As secções relevantes do ficheiro ServiceDefinition.csdef são apresentadas aqui:

<ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WorkerRole name="WorkerRole1">
    ...

    <LocalResources>
      <LocalStorage name="StartupLocalStorage" sizeInMB="5"/>
    </LocalResources>

    <Startup>
      <Task commandLine="Startup.cmd" executionContext="limited" taskType="simple">
        <Environment>
          <Variable name="PathToStartupStorage">
            <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/LocalResources/LocalResource[@name='StartupLocalStorage']/@path" />
          </Variable>
        </Environment>
      </Task>
    </Startup>
  </WorkerRole>
</ServiceDefinition>

Por exemplo, este ficheiro batch Startup.cmd utiliza a variável de ambiente PathToStartupStorage para criar o ficheiro MyTest.txt na localização de armazenamento local.

REM   Create a simple text file.

ECHO This text will go into the MyTest.txt file which will be in the    >  "%PathToStartupStorage%\MyTest.txt"
ECHO path pointed to by the PathToStartupStorage environment variable.  >> "%PathToStartupStorage%\MyTest.txt"
ECHO The contents of the PathToStartupStorage environment variable is   >> "%PathToStartupStorage%\MyTest.txt"
ECHO "%PathToStartupStorage%".                                          >> "%PathToStartupStorage%\MyTest.txt"

REM   Exit the batch file with ERRORLEVEL 0.

EXIT /b 0

Pode aceder à pasta de armazenamento local a partir do SDK do Azure com o método GetLocalResource .

string localStoragePath = Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.GetLocalResource("StartupLocalStorage").RootPath;

string fileContent = System.IO.File.ReadAllText(System.IO.Path.Combine(localStoragePath, "MyTestFile.txt"));

Executar no emulador ou na cloud

Pode fazer com que a sua tarefa de arranque execute passos diferentes quando está a funcionar na cloud em comparação com quando está no emulador de computação. Por exemplo, poderá querer utilizar uma nova cópia dos seus dados SQL apenas quando estiver em execução no emulador. Em alternativa, poderá querer efetuar algumas otimizações de desempenho para a cloud que não precisa de fazer ao executar no emulador.

Esta capacidade de realizar diferentes ações no emulador de computação e na cloud pode ser efetuada ao criar uma variável de ambiente no ficheiro ServiceDefinition.csdef . Em seguida, vai testar essa variável de ambiente para obter um valor na sua tarefa de arranque.

Para criar a variável de ambiente, adicione o elementoRoleInstanceValue da Variável/ e crie um valor XPath de /RoleEnvironment/Deployment/@emulated. O valor da variável de ambiente %ComputeEmulatorRunning% é quando é true executado no emulador de computação e false quando é executado na cloud.

<ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WorkerRole name="WorkerRole1">

    ...

    <Startup>
      <Task commandLine="Startup.cmd" executionContext="limited" taskType="simple">
        <Environment>
          <Variable name="ComputeEmulatorRunning">
            <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
          </Variable>
        </Environment>
      </Task>
    </Startup>

  </WorkerRole>
</ServiceDefinition>

A tarefa pode agora verificar a variável de ambiente %ComputeEmulatorRunning% para executar diferentes ações com base no facto de a função estar em execução na cloud ou no emulador. Segue-se um script de shell .cmd que verifica a variável de ambiente.

REM   Check if this task is running on the compute emulator.

IF "%ComputeEmulatorRunning%" == "true" (
    REM   This task is running on the compute emulator. Perform tasks that must be run only in the compute emulator.
) ELSE (
    REM   This task is running on the cloud. Perform tasks that must be run only in the cloud.
)

Detetar que a tarefa já foi executada

A função pode ser reciclada sem um reinício, fazendo com que as tarefas de arranque voltem a ser executadas. Não existe nenhum sinalizador que indique que uma tarefa já foi executada na VM de alojamento. Pode ter algumas tarefas em que não importa que sejam executadas várias vezes. No entanto, pode deparar-se com uma situação em que tem de impedir que uma tarefa seja executada mais do que uma vez.

A forma mais simples de detetar que uma tarefa já foi executada é criar um ficheiro na pasta %TEMP% quando a tarefa for bem-sucedida e procurá-la no início da tarefa. Segue-se um script de shell de cmd de exemplo que o faz por si.

REM   If Task1_Success.txt exists, then Application 1 is already installed.
IF EXIST "%PathToApp1Install%\Task1_Success.txt" (
  ECHO Application 1 is already installed. Exiting. >> "%TEMP%\StartupLog.txt" 2>&1
  GOTO Finish
)

REM   Run your real exe task
ECHO Running XYZ >> "%TEMP%\StartupLog.txt" 2>&1
"%PathToApp1Install%\setup.exe" >> "%TEMP%\StartupLog.txt" 2>&1

IF %ERRORLEVEL% EQU 0 (
  REM   The application installed without error. Create a file to indicate that the task
  REM   does not need to be run again.

  ECHO This line will create a file to indicate that Application 1 installed correctly. > "%PathToApp1Install%\Task1_Success.txt"

) ELSE (
  REM   An error occurred. Log the error and exit with the error code.

  DATE /T >> "%TEMP%\StartupLog.txt" 2>&1
  TIME /T >> "%TEMP%\StartupLog.txt" 2>&1
  ECHO  An error occurred running task 1. Errorlevel = %ERRORLEVEL%. >> "%TEMP%\StartupLog.txt" 2>&1

  EXIT %ERRORLEVEL%
)

:Finish

REM   Exit normally.
EXIT /B 0

Melhores práticas de tarefas

Seguem-se algumas das melhores práticas que deve seguir ao configurar a tarefa para a sua função web ou de trabalho.

Registar sempre atividades de arranque

O Visual Studio não fornece um depurador para percorrer ficheiros em lotes, pelo que é bom obter o máximo de dados possível sobre a operação de ficheiros em lote. Registar a saída de ficheiros em lote, tanto stdout como stderr, pode fornecer-lhe informações importantes ao tentar depurar e corrigir ficheiros em lote. Para registar o stdout e o stderr no ficheiro de StartupLog.txt no diretório apontado pela variável de ambiente %TEMP%, adicione o texto >> "%TEMP%\\StartupLog.txt" 2>&1 ao fim de linhas específicas que pretende registar. Por exemplo, para executar setup.exe no diretório %PathToApp1Install% : "%PathToApp1Install%\setup.exe" >> "%TEMP%\StartupLog.txt" 2>&1

Para simplificar o xml, pode criar um ficheiro cmd de wrapper que chama todas as suas tarefas de arranque juntamente com o registo e garante que cada tarefa subordinada partilha as mesmas variáveis de ambiente.

No entanto, pode achar irritante utilizar >> "%TEMP%\StartupLog.txt" 2>&1 no final de cada tarefa de arranque. Pode impor o registo de tarefas ao criar um wrapper que processa o registo por si. Este wrapper chama o ficheiro de lote real que pretende executar. Qualquer saída do ficheiro de lote de destino será redirecionada para o ficheiro Startuplog.txt .

O exemplo seguinte mostra como redirecionar todos os resultados de um ficheiro de lote de arranque. Neste exemplo, o ficheiro ServerDefinition.csdef cria uma tarefa de arranque que chama logwrap.cmd. logwrap.cmd chama Startup2.cmd, redirecionando todos os resultados para %TEMP%\StartupLog.txt.

ServiceDefinition.cmd:

<Startup>
    <Task commandLine="logwrap.cmd startup2.cmd" executionContext="limited" taskType="simple" />
</Startup>

logwrap.cmd:

@ECHO OFF

REM   logwrap.cmd calls passed in batch file, redirecting all output to the StartupLog.txt log file.

ECHO [%date% %time%] == START logwrap.cmd ============================================== >> "%TEMP%\StartupLog.txt" 2>&1
ECHO [%date% %time%] Running %1 >> "%TEMP%\StartupLog.txt" 2>&1

REM   Call the child command batch file, redirecting all output to the StartupLog.txt log file.
START /B /WAIT %1 >> "%TEMP%\StartupLog.txt" 2>&1

REM   Log the completion of child command.
ECHO [%date% %time%] Done >> "%TEMP%\StartupLog.txt" 2>&1

IF %ERRORLEVEL% EQU 0 (

   REM   No errors occurred. Exit logwrap.cmd normally.
   ECHO [%date% %time%] == END logwrap.cmd ================================================ >> "%TEMP%\StartupLog.txt" 2>&1
   ECHO.  >> "%TEMP%\StartupLog.txt" 2>&1
   EXIT /B 0

) ELSE (

   REM   Log the error.
   ECHO [%date% %time%] An error occurred. The ERRORLEVEL = %ERRORLEVEL%.  >> "%TEMP%\StartupLog.txt" 2>&1
   ECHO [%date% %time%] == END logwrap.cmd ================================================ >> "%TEMP%\StartupLog.txt" 2>&1
   ECHO.  >> "%TEMP%\StartupLog.txt" 2>&1
   EXIT /B %ERRORLEVEL%

)

Startup2.cmd:

@ECHO OFF

REM   This is the batch file where the startup steps should be performed. Because of the
REM   way Startup2.cmd was called, all commands and their outputs will be stored in the
REM   StartupLog.txt file in the directory pointed to by the TEMP environment variable.

REM   If an error occurs, the following command will pass the ERRORLEVEL back to the
REM   calling batch file.

ECHO [%date% %time%] Some log information about this task
ECHO [%date% %time%] Some more log information about this task

EXIT %ERRORLEVEL%

Saída de exemplo no ficheiro deStartupLog.txt :

[Mon 10/17/2016 20:24:46.75] == START logwrap.cmd ============================================== 
[Mon 10/17/2016 20:24:46.75] Running command1.cmd 
[Mon 10/17/2016 20:24:46.77] Some log information about this task
[Mon 10/17/2016 20:24:46.77] Some more log information about this task
[Mon 10/17/2016 20:24:46.77] Done 
[Mon 10/17/2016 20:24:46.77] == END logwrap.cmd ================================================ 

Dica

O ficheiro StartupLog.txt está localizado na pasta C:\Resources\temp\{role identifier}\RoleTemp .

Definir executionContext adequadamente para tarefas de arranque

Defina os privilégios adequadamente para a tarefa de arranque. Por vezes, as tarefas de arranque têm de ser executadas com privilégios elevados, mesmo que a função seja executada com privilégios normais.

O atributo executionContext define o nível de privilégio da tarefa de arranque. Utilizar executionContext="limited" significa que a tarefa de arranque tem o mesmo nível de privilégio que a função. Utilizar executionContext="elevated" significa que a tarefa de arranque tem privilégios de administrador, o que permite que a tarefa de arranque execute tarefas de administrador sem conceder privilégios de administrador à sua função.

Um exemplo de uma tarefa de arranque que requer privilégios elevados é uma tarefa de arranque que utiliza AppCmd.exe para configurar o IIS. AppCmd.exe requer executionContext="elevated".

Utilizar o taskType adequado

O atributo taskType determina a forma como a tarefa de arranque é executada. Existem três valores: simples, fundo e primeiro plano. As tarefas de fundo e primeiro plano são iniciadas de forma assíncrona e, em seguida, as tarefas simples são executadas de forma síncrona uma de cada vez.

Com tarefas de arranque simples , pode definir a ordem pela qual as tarefas são executadas pela ordem pela qual as tarefas estão listadas no ficheiro ServiceDefinition.csdef. Se uma tarefa simples terminar com um código de saída sem zero, o procedimento de arranque para e a função não é iniciada.

A diferença entre tarefas de arranque em segundo plano e tarefas de arranque em primeiro plano é que as tarefas de primeiro plano mantêm a função em execução até que a tarefa de primeiro plano termine. Isto também significa que, se a tarefa de primeiro plano bloquear ou falhar, a função não será reciclada até que a tarefa de primeiro plano seja forçada a fechar. Por este motivo, as tarefas em segundo plano são recomendadas para tarefas de arranque assíncronas, a menos que precise dessa funcionalidade da tarefa de primeiro plano .

Terminar ficheiros em lote com EXIT /B 0

A função só será iniciada se o nível de erro de cada uma das tarefas de arranque simples for zero. Nem todos os programas definem o nível de erro (código de saída) corretamente, pelo que o ficheiro batch deve terminar com um EXIT /B 0 se tudo tiver sido executado corretamente.

Um ficheiro em falta EXIT /B 0 no final de um ficheiro de lote de arranque é uma causa comum de funções que não são iniciadas.

Nota

Reparei que, por vezes, os ficheiros em lote aninhados deixam de responder ao utilizar o /B parâmetro. Poderá querer certificar-se de que este problema não ocorre se outro ficheiro de lote chamar o ficheiro de lote atual, como se utilizasse o wrapper de registo. Pode omitir o /B parâmetro neste caso.

Esperar que as tarefas de arranque executem mais do que uma vez

Nem todas as reciclagens de funções incluem um reinício, mas todas as reciclagens de funções incluem a execução de todas as tarefas de arranque. Isto significa que as tarefas de arranque têm de ser capazes de ser executadas várias vezes entre reinícios sem problemas. Isto é discutido na secção anterior.

Utilizar o armazenamento local para armazenar ficheiros que têm de ser acedidos na função

Se quiser copiar ou criar um ficheiro durante a tarefa de arranque que está acessível à sua função, esse ficheiro tem de ser colocado no armazenamento local. Veja a secção anterior.

Passos seguintes

Rever o modelo e o pacote do serviço cloud

Saiba mais sobre como funcionam as Tarefas .

Crie e implemente o seu pacote de serviço cloud.