執行關閉指令碼

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

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

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

事前準備

這項工作需要的權限

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

規格

限制

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

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

關閉指令碼叫用

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

  • 執行個體因對 API 的 instances.delete 要求或 instances.stop 要求而關閉。
  • 屬於先佔程序的一部分,由 Compute Engine 停止先佔執行個體。
  • 執行個體透過對訪客作業系統的要求而關閉,例如 sudo shutdown 或是 sudo reboot
  • 您透過 GCP 主控台或 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 的中繼資料值長度限制。要使用超出長度限制的指令碼,請將檔案儲存在 Google Cloud Storage 中。詳情請參閱透過 Google 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 主控台,使用 shutdown-script 中繼資料鍵值直接指定關閉指令碼:

  1. 在 GCP 主控台中,前往「VM Instances」(VM 執行個體) 頁面。

    前往 VM 執行個體頁面

  2. 按一下 [建立執行個體]
  3. 在「Create a new instance」 (建立新執行個體) 頁面上,填入您要為執行個體 設定的屬性。 如需進階設定選項,請展開「管理、安全性、磁碟、網路、單獨租用」區段。
  4. 在「Metadata」(中繼資料) 部分,填寫 shutdown-script 做為中繼資料鍵值。
  5. 在「值」方塊中,提供關閉指令碼內容。
  6. 按一下 [Create] (建立) 來建立執行個體。

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://www.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

透過 Google Cloud Storage 使用關閉指令碼

您可以透過 Google 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:使用此鍵值提供關閉指令碼檔案的 Google Cloud Storage 網址。
本頁內容對您是否有任何幫助?請提供意見:

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

這個網頁
Compute Engine 說明文件