如何設定及執行 Azure 雲端服務 (傳統) 的啟動工作
重要
截至 2024 年 9 月 1 日,所有客戶的雲端服務 (傳統) 均已淘汰。 自 2024 年 10 月起,Microsoft 將停止並關閉任何執行中的現有部署,且資料將永久遺失。 新部署應該使用 Azure Resource Manager 型的新部署模型 Azure 雲端服務 (延伸支援)。
您可以利用啟動工作,在角色啟動之前執行作業。 您可能想要執行的作業包括安裝元件、註冊元件物件模型 (COM) 元件、設定登錄機碼,或啟動長時間執行的處理序。
注意
啟動工作不適用於虛擬機器,只適用於雲端服務 Web 和背景工作角色。
啟動工作的運作方式
啟動工作是角色啟動前執行的動作。 ServiceDefinition.csdef 檔透過使用啟動元素中的工作元素來定義啟動工作。 啟動工作經常是批次檔,但也可以是主控台應用程式,或是啟動 PowerShell 指令碼的批次檔。
環境變數可將資訊傳入啟動工作,而本機存放區可以用來傳遞來自啟動工作的資訊。 例如,環境變數可以指定您想要安裝的程式路徑,以及可以將哪些檔案寫入本機存放區。 您的角色可以從該處讀取檔案。
啟動工作可以將資訊和錯誤記錄到 TEMP 環境變數所指定的目錄中。 在雲端上執行時,TEMP 環境變數將於啟動工作期間解析成 C:\Resources\temp\[guid].[角色名稱]\RoleTemp 目錄。
啟動工作也可以在重新開機之間執行數次。 例如,每次角色回收時,會執行啟動工作,但每次角色回收不一定會重新開機。 啟動工作的撰寫方式,應該要可讓它們順利執行多次。
啟動工作必須以零值的 errorlevel (或結束代碼) 做為結尾,才算完成啟動處理序。 如果啟動工作的結尾不是零值的 errorlevel,角色會啟動失敗。
角色啟動順序
以下列出 Azure 中的角色啟動程序:
執行個體標示為 啟動中,且沒有收到流量。
所有啟動工作均會根據其 taskType 屬性來執行。
simple 的工作會以同步方式執行,一次一個。
background 和 foreground 工作則會以非同步方式啟動,與啟動工作平行執行。
警告
在啟動處理序中的啟動工作階段期間,IIS 可能不會完全設定好,因此特定的角色資料可能會無法使用。 需要特定角色資料的啟動工作應該使用 Microsoft.WindowsAzure.ServiceRuntime.RoleEntryPoint.OnStart。
角色主機處理序已啟動,且已在網際網路資訊服務 (IIS) 中建立網站。
呼叫了 Microsoft.WindowsAzure.ServiceRuntime.RoleEntryPoint.OnStart 方法。
執行個體標示為 就緒 ,且流量已路由傳送至執行個體。
呼叫了 Microsoft.WindowsAzure.ServiceRuntime.RoleEntryPoint.Run 方法。
啟動工作範例
啟動工作會在 ServiceDefinition.csdef 檔案中的 Task 項目定義。 commandLine 屬性指定啟動批次檔案或主控台命令的名稱和參數,executionContext 屬性指定啟動工作的權限等級,而 taskType 屬性會指定工作執行的方式。
在此範例中,針對啟動工作建立環境變數 MyVersionNumber,並設定為值 "1.0.0.0"。
ServiceDefinition.csdef:
<Startup>
<Task commandLine="Startup.cmd" executionContext="limited" taskType="simple" >
<Environment>
<Variable name="MyVersionNumber" value="1.0.0.0" />
</Environment>
</Task>
</Startup>
在以下範例中, Startup.cmd 批次檔將 "The current version is 1.0.0.0" 一行寫入了 StartupLog.txt 檔案,此檔案位於 TEMP 環境變數所指定的目錄中。 EXIT /B 0
一行將確保啟動工作是以零值的 errorlevel 為結尾。
ECHO The current version is %MyVersionNumber% >> "%TEMP%\StartupLog.txt" 2>&1
EXIT /B 0
注意
在 Visual Studio 中,應該將啟動批次檔的 [複製到輸出目錄] 屬性,設定為 [一律複製],才能確保能將啟動批次檔正確地部署至 Azure 上的專案 (Web 角色為 approot\bin,且背景工作角色為 approot)。
工作屬性說明
以下說明 ServiceDefinition.csdef 檔案中 Task 項目的屬性:
commandLine - 指定啟動工作的命令列:
- 此命令使用選擇性命令列參數,可開始啟動工作。
- 這屬性通常是 .cmd 或 .bat 批次檔的檔名。
- 該工作相對於部署的 AppRoot\Bin 資料夾。 在決定工作的路徑和檔案時,不會展開環境變數。 如果需要展開環境變數,可以建立小型 .cmd 指令碼,藉以呼叫啟動工作。
- 可以是主控台應用程式,或啟動 PowerShell 指令碼的批次檔。
executionContext - 指定啟動工作的權限等級。 權限等級可以是 limited (受到限制) 或 elevated (提高權限):
- limited
啟動工作執行時會使用和角色相同的權限。 當 Runtime 項目的 executionContext 屬性也是 limited 時,就會用到使用者權限。 - elevated
啟動工作執行時會使用系統管理員權限。 這些權限可讓啟動工作安裝程式、變更 IIS 組態、執行登錄變更,以及其他系統管理員層級的工作,且不會提高角色本身的權限等級。
注意
啟動工作的權限等級不需要與角色本身相同。
taskType - 指定啟動工作執行的方式。
simple
工作會以同步的方式執行,一次一個,並依照 ServiceDefinition.csdef 檔案所指定的順序。 當某個 simple 啟動工作結束時的 errorlevel 為零,就會執行下一個 simple 啟動工作。 如果沒有任何 simple 啟動工作需要執行,會啟動角色本身。注意
如果 simple 工作結束時的 errorlevel 不是零,則會封鎖執行個體。 後續的 simple 啟動工作和角色本身將不會啟動。
若要確保批次檔結束時的 errorlevel 為零,請在批次檔處理序結束時執行命令
EXIT /B 0
。background
以非同步方式執行工作,並與角色的啟動工作平行進行。foreground
以非同步方式執行工作,並與角色的啟動工作平行進行。 foreground 和 background 工作之間的主要差異,在於 foreground 工作可避免角色在工作結束之前遭到回收或關閉。 background 工作則不具備這項限制功能。
環境變數
環境變數是將資訊傳遞給啟動工作的方式。 例如,您可以放上這些項目的路徑:含有要安裝之程式的 Blob,或角色要使用的連接埠號碼,或是各項可控制啟動工作功能的設定。
啟動工作的環境變數有兩種類型,包括靜態環境變數,還有以 RoleEnvironment 類別的成員為基礎的環境變數。 這兩者都位於 ServiceDefinition.csdef 檔案的 Environment 區段中,而且都使用 Variable 元素和 name 屬性。
靜態環境變數會使用 Variable 項目的 value 屬性。 前述範例會建立環境變數 MyVersionNumber,這具有靜態值 "1.0.0.0"。 另一個範例則是建立 StagingOrProduction 環境變數,您可以手動將值設為 "staging" 或 "production",以根據 StagingOrProduction 環境變數的值執行不同的啟動動作。
以 RoleEnvironment 類別的成員為基礎的環境變數不會使用 Variable 項目的 value 屬性。 相反地,這會使用具有適當 XPath 屬性值的 RoleInstanceValue 子元素,藉此建立以 RoleEnvironment 類別的特定成員為基礎的環境變數。 這裡有存取各種 RoleEnvironment 值的 XPath 屬性值。
例如,若要建立一個環境變數,而且當執行個體在計算模擬器中執行時值為 "true",而在雲端中執行時值為 "false",請使用下列 Variable 和 RoleInstanceValue 元素:
<Startup>
<Task commandLine="Startup.cmd" executionContext="limited" taskType="simple">
<Environment>
<!-- Create the environment variable that informs the startup task whether it is running
in the Compute Emulator or in the cloud. "%ComputeEmulatorRunning%"=="true" when
running in the Compute Emulator, "%ComputeEmulatorRunning%"=="false" when running
in the cloud. -->
<Variable name="ComputeEmulatorRunning">
<RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
</Variable>
</Environment>
</Task>
</Startup>
下一步
了解如何透過雲端服務執行一些 常見的啟動工作 。
封裝 雲端服務。