匯出 (0) 列印
全部展開

啟動工作的最佳作法

更新日期: 2013年11月

啟動工作設定全域屬性

由於啟動工作是在 IIS 完全啟動及設定妥之前執行,啟動工作不適合設定網站、角色或執行個體屬性。啟動工作較為適合設定全域屬性。

網站、角色和執行個體專屬的屬性應該從 Microsoft.WindowsAzure.ServiceRuntime.RoleEntryPoint.OnStart 方法中設定。

一律記錄啟動活動

Visual Studio 並未提供可逐步執行批次檔的偵錯工具,因此最好是盡量在批次檔作業時多取得資料。記錄批次檔的輸出,包括 stdoutstderr,可在您嘗試偵錯及修正批次檔時提供重要資訊。若要將 stdoutstderr 記錄到 TEMP 環境變數所指向之目錄中的 StartupLog.txt 檔案,請將 >> "%TEMP%\StartupLog.txt" 2>&1 這段文字加入至您要記錄的特定行尾。例如,若要執行 %PathToApp1Install% 目錄中的 setup.exe:

"%PathToApp1Install%\setup.exe" >> "%TEMP%\StartupLog.txt" 2>&1

如果您要記錄啟動工作的所有輸出,但未將 >> "%TEMP%\StartupLog.txt" 2>&1 加入至每一行結尾,就需要兩個啟動批次檔。第一個批次檔將呼叫第二個批次檔,透過重新導向以記錄第二個批次檔的所有活動。這是正確形成重新導向的必要作法。

下列範例示範如何從啟動批次檔重新導向所有輸出。在此範例中,ServerDefinition.csdef 檔會建立啟動工作呼叫 Startup1.cmd。Startup1.cmd 呼叫 Startup2.cmd,將所有輸出重新導向至 %TEMP%\StartupLog.txt。

ServiceDefinition.cmd:

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

Startup1.cmd:

REM   Startup1.cmd calls the main startup batch file, Startup2.cmd, redirecting all output 
REM   to the StartupLog.txt log file.

REM   Log the startup date and time.
ECHO Startup1.cmd: >> "%TEMP%\StartupLog.txt" 2>&1
ECHO Current date and time: >> "%TEMP%\StartupLog.txt" 2>&1
DATE /T >> "%TEMP%\StartupLog.txt" 2>&1
TIME /T >> "%TEMP%\StartupLog.txt" 2>&1
ECHO Starting up Startup2.cmd. >> "%TEMP%\StartupLog.txt" 2>&1

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

REM   Log the completion of Startup1.cmd.
ECHO Returned to Startup1.cmd. >> "%TEMP%\StartupLog.txt" 2>&1

IF ERRORLEVEL EQU 0 (
   REM   No errors occurred. Exit Startup1.cmd normally.
   EXIT /B 0
) ELSE (
   REM   Log the error.
   ECHO An error occurred. The ERRORLEVEL = %ERRORLEVEL%.  >> "%TEMP%\StartupLog.txt" 2>&1
   EXIT %ERRORLEVEL%
)

Startup2.cmd:

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.
EXIT /B %ERRORLEVEL%

為啟動工作適當地設定 executionContext

為啟動工作設定適當的權限。在某些情況下,當角色以一般權限執行時,啟動工作必須以更高的權限執行。

executionContext 屬性是設定啟動工作的權限層級。使用 executionContext="limited" 表示啟動工作的權限層級將與角色相同。使用 executionContext="elevated" 表示啟動工作將具備系統管理員權限,讓啟動工作得以執行系統管理員工作,而不需要對角色授與系統管理員權限。

需要更高權限的啟動工作,其中一例便是使用 AppCmd.exe 設定 IIS 的啟動工作。AppCmd.exe 需要 Task 項目中有 executionContext="elevated"

下列範例會為啟動工作 ConfigureIISSettings.cmd 設定更高的權限:

    <Startup>
      <Task commandLine="ConfigureIISSettings.cmd" executionContext="elevated" taskType="simple" />
    </Startup>

使用適當的 taskType

taskType 屬性決定了啟動工作的執行方式。taskType 值有三種:simplebackgroundforeground。背景和前景工作會以非同步方式啟動,而簡單工作將以同步方式執行,一次執行一個工作。

針對 simple 啟動工作,您可以設定各個工作依照 ServiceDefinition.csdef 檔案中列出工作的順序執行。如果 simple 工作以非零值結束代碼結束,啟動程序就會停止,而角色將不會啟動。

background 啟動工作與 foreground 啟動工作之間的差異在於 foreground 工作會讓角色保持執行直到 foreground 工作結束。這也表示一旦 foreground 工作停止回應或當機,就要等到 foreground 工作強制關閉後才會回收角色。因此,非同步啟動工作除非需要 foreground 工作的功能,建議一律使用 background 工作。

以 EXIT /B 0 結束批次檔

如果每一個簡單啟動工作的 errorlevel 都是零,角色才會啟動。未必所有的程式都能正確設定 errorlevel (結束代碼),因而批次檔必須以 EXIT /B 0 命令結束。

啟動批次檔結尾遺漏 EXIT /B 0 是致使角色未啟動的常見原因。

預期啟動工作會多次執行

並非所有角色回收都包括重新開機,不過,所有角色回收都包括執行所有啟動工作。這表示啟動工作必須能夠因應接連重新開機而多次執行。寫入可執行多次之啟動工作的策略對此提出了極為詳盡的討論。

使用本機儲存體來儲存必須在角色中存取的檔案

如果您要在啟動工作期間複製或建立可供角色存取的檔案,則該檔案必須放置於本機儲存體。如需有關如何為啟動工作和角色建立與使用本機儲存體的詳細指示,請參閱<使用本機儲存體在啟動期間儲存檔案>一文。

另請參閱

Microsoft 正展開一份線上問卷調查,了解您對於 MSDN 網站的看法。 如果您選擇參加,您離開 MSDN 網站時即會顯示線上問卷調查。

您是否想要參加?
顯示:
© 2014 Microsoft