執行關機指令碼

建立和執行關機指令碼,使其在執行個體終止或重新啟動前執行指令。如果您依賴自動指令碼來啟動和關閉執行個體、讓執行個體清理或執行任務 (例如匯出記錄或與其他系統同步),這功能會非常實用。

代管執行個體群組中具有自動配置器的執行個體來說,關機指令碼是一項特別實用的功能。假如自動配置器關閉群組中的執行個體,則關機指令碼會在執行個體停止之前開始執行,而且會執行您定義的任何操作。指令碼會在執行個體停止前的有限關閉期限中執行。舉例來說,您的關機指令碼可能會將已處理的資料複製到 Cloud Storage 或備份任何記錄檔。

關機指令碼的功能與開機指令碼非常相似。開機指令碼的多數說明文件也適用於關機指令碼。

事前準備

這項工作需要的權限

如要執行這項工作,您必須具備以下權限

  • 建立執行個體需要的所有權限
  • 執行個體的 compute.instances.setMetadata 權限

規格

限制

使用關機指令碼時,一些必須注意的限制如下:

  • 在執行個體停止之前,關機指令碼必須在限制時間內結束執行:
    • 隨選執行個體:停止或刪除執行個體後 90 秒內
    • 先佔執行個體:執行個體先佔作業開始之後 30 秒內
  • Compute Engine 會儘可能執行關機指令碼,但不保證能在所有情況下都完全執行關機指令碼 (有極少數情況無法完成)。
  • 針對 Linux 執行個體,您只能搭配映像檔 v20141007 以上版本來使用關機指令碼。而如果是 Windows Server 執行個體,您只能搭配映像檔 v20150310 或以上版本來使用關機指令碼。

關機指令碼叫用

關機指令碼會由特定進階設定和電源介面 (ACPI) 事件 (例如重新啟動或終止) 觸發。有許多方法可以重新啟動或終止執行個體,但只有一些操作會觸發關機指令碼。以下包含部分觸發關機指令碼的操作:

  • 因對 API 提出 instances.delete 要求或 instances.stop 要求而關閉執行個體。
  • 屬於先佔程序的一部分,由 Compute Engine 停止先佔執行個體。
  • 透過對訪客作業系統提出如 sudo shutdownsudo reboot 要求而關閉執行個體。
  • 透過 GCP Console 或 gcloud compute 工具手動關閉執行個體

如果使用 instances().reset 重設執行個體,關機指令碼就不會執行。

關機指令碼可以是任何檔案類型。如果有關機指令碼,Compute Engine 將執行以下操作:

  1. 將指令碼複製到執行個體中的本機檔案。
  2. 設定檔案的權限並將它設為可執行。
  3. 在執行個體終止時執行該檔案。

例如,您可以提供 Python 指令碼而不是 Bash 指令碼。請注意,Compute Engine 會確實地執行指令碼,無論其類型為何。

如要執行非 Bash 指令碼,請在檔案頂端新增一個工作行,讓作業系統知道要使用哪個解譯器。舉例來說,您可以針對 Python 指令碼新增如下的工作行:

#!/usr/bin/python

關機指令碼執行時間

在執行個體關閉或重新啟動之前,關機指令碼的執行時間有限。Compute Engine 在這段期間會嘗試執行關機指令碼。如果指令碼的執行時間超過這個時間範圍,則此執行個體會自動終止,而所有執行中的工作都會結束。若是使用 sudo shutdown 指令向訪客作業系統提出要求,以關閉或重新啟動執行個體,這種情況則不適用該時間限制。

關閉期限的長度會因執行個體的類型而異。先佔執行個體的關閉期限比一般執行個體還短。如要進一步瞭解每種執行個體類型的關閉時間限制,請參閱關閉期限

一般來說,關機指令碼必須在其關閉期限內完成運行,以便作業系統有時間完成其關閉過程並將緩衝區內容排清至磁碟。

使用本機關機指令碼

本機關機指令碼是存放在本機電腦的指令碼。您可以將本機關機指令碼透過檔案的形式傳入,或是直接將內容傳給 Compute Engine。

關機指令碼可以根據需要執行不限次數的操作,但如果您在本機傳入檔案,則指令碼長度不得超過中繼資料值的上限 256 KB。如要使用長度超過上限的指令碼,請將檔案儲存至 Cloud Storage。詳情請參閱透過 Cloud Storage 使用關機指令碼一節。

提供關機指令碼檔案

您只能透過 gcloud 指令列工具傳入本機關機指令碼檔案。

如要傳入本機關機指令碼檔案,請加入 --metadata-from-file 旗標並在後面加上中繼資料鍵值組合 shutdown-script=PATH/TO/FILE,其中 PATH/TO/FILE 是關機指令碼的相對路徑。例如:

gcloud compute instances create example-instance \
    --metadata-from-file shutdown-script=examples/scripts/install.sh

直接提供關機指令碼

您也可以直接傳入關機指令碼內容。

主控台

在 GCP Console 中,使用 shutdown-script 中繼資料鍵值直接指定關機指令碼:

gcloud

使用 gcloud 指令列工具時,請使用 --metadata 旗標來提供關機指令碼的內容,後面再加上 shutdown-script=CONTENTS 鍵值組合,其中 CONTENTS 是關機指令碼的內容。

gcloud compute instances create example-instance --metadata shutdown-script="#! /bin/bash
> # Shuts down Apache server
> /etc/init.d/apache2 stop"

API

在 API 中,建立執行個體時,請在要求中提供做為中繼資料屬性的關機指令碼。使用 shutdown-script 做為中繼資料鍵值:

POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances

{...
  "metadata": {
    "items": [
      {
       "key": "shutdown-script",
       "value": "#! /bin/bash\n\n# Shuts down Apache server\n/etc/init.d/apache2 stop"
      }
    ]
  }...
}

在 Windows 執行個體上提供關機指令碼

使用以下 Windows 專用中繼資料鍵值,在 Windows 執行個體上執行關機指令碼。可從下面列出的所有特殊鍵中加以選擇。每組鍵值都應與您要執行的指令碼類型相符。

您可以透過向執行個體傳入不同的鍵值來指定多個關機指令碼,但每個虛擬機器只能指定一組鍵值。

以下鍵值可與關機指令碼一起使用,請參閱上述的相同操作說明

cmd 關機指令碼 bat 關機指令碼 ps1 關機指令碼
windows-shutdown-script-cmd windows-shutdown-script-bat windows-shutdown-script-ps1

透過 Cloud Storage 使用關機指令碼

您可以透過 Cloud Storage 儲存和使用關機指令碼。請按照開機指令碼說明文件中的指示操作,但要將 startup-script-url 替換成 shutdown-script-url

如果是 Windows 執行個體,請將 windows-startup-script-url 替換成 windows-shutdown-script-url

為執行中的執行個體套用關機指令碼

如要將關機指令碼新增至執行中的執行個體,請按照將開機指令碼套用至執行中的執行個體說明文件的指示操作,但是要將中繼資料鍵換成下列鍵值:

  • shutdown-script:直接使用這個鍵值提供關機指令碼內容。您可以使用 gcloud 指令列工具,透過 --metadata-from-file 旗標和 shutdown-script 中繼資料鍵值,提供關機指令碼檔案的路徑。
  • shutdown-script-url:使用這個鍵值將 Cloud Storage URL 提供給關機指令碼檔案。
本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Compute Engine 說明文件