运行关闭脚本


创建并运行可在虚拟机实例停止或重启前执行命令的关停脚本。如果您依靠自动脚本启动和关停实例,这将非常有用,因为实例有时间清理或执行任务,如导出日志或与其他系统同步。

关停脚本对于具有自动扩缩器托管实例组中的虚拟机尤其有用。如果自动扩缩器关停组中的虚拟机,则关停脚本会在虚拟机停止前运行并执行您定义的任何操作。该脚本在虚拟机停止前的有限关停期运行。例如,关停脚本可能会将已处理的数据复制到 Cloud Storage 或备份任何日志。

关闭脚本的运行方式与启动脚本非常相似。启动脚本的大部分文档也适用于关停脚本。

对于关停和重新启动任务,虚拟机始终按以下方式运行关闭脚本:

  • 对于 Linux 虚拟机,请使用 root 用户。
  • 对于 Windows 虚拟机,请使用 System 账号。

准备工作

  • 了解启动脚本
  • 了解元数据服务器是什么。
  • 如果您尚未设置身份验证,请进行设置。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. 安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init
    2. Set a default region and zone.
    3. Terraform

      如需在本地开发环境中使用本页面上的 Terraform 示例,请安装并初始化 gcloud CLI,然后使用您的用户凭据设置应用默认凭据。

      1. 安装 Google Cloud CLI。
      2. 如需初始化 gcloud CLI,请运行以下命令:

        gcloud init
      3. 为您的 Google 账号创建本地身份验证凭据:

        gcloud auth application-default login

      如需了解详情,请参阅 Set up authentication for a local development environment

      REST

      如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。

        安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

        gcloud init

      如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证

执行此任务所需的权限

您必须拥有以下权限才能执行此任务:

  • 创建新实例所需的所有权限
  • 针对实例的 compute.instances.setMetadata 权限

规范

限制

使用关停脚本时需要注意一些限制:

  • 实例停止之前会留出一段限定的时间,以允许关停脚本完成运行:
    • 按需实例:停止或删除实例后 90 秒
    • 抢占式实例:实例抢占开始后 30 秒
  • Compute Engine 仅保证尽量执行关停脚本。在极少数情况下,Compute Engine 无法保证关停脚本一定会完成。
  • 在 Windows 上,本地组策略用于启动关停脚本。
    • 安装软件包会配置本地组策略 Computer Configuration/Windows Setting/Scripts (Startup/Shutdown) 设置,以在系统关闭时启动脚本。

关停脚本调用

关停脚本由某些高级配置与电源接口 (ACPI) 事件(例如重启或停止)触发。有很多方法来重启或停止实例,但只有一些方法会触发关停脚本运行。在执行以下操作时,关停脚本会运行:

  • 由于对 API 发出 instances.delete 请求或 instances.stop 请求而导致实例关停时。
  • Compute Engine 在抢占过程中停止抢占式实例时。
  • 通过对访客操作系统发出请求(例如 sudo shutdownsudo reboot)来关停实例时。
  • 通过 Google Cloud 控制台或 gcloud compute 工具手动关停实例时。

如果使用 instances().reset 重置实例,则关停脚本将不会运行。

关停脚本可以是任何文件类型。如果存在关停脚本,Compute Engine 将执行以下操作:

  1. 将脚本复制到实例中的本地文件。
  2. 设置文件的权限,使其可执行。
  3. 在实例停止时执行该文件。

例如,您可以提供 Python 脚本而不是 bash 脚本。请注意,无论是什么类型的脚本,Compute Engine 都会逐字运行脚本。

要执行非 bash 脚本,请在文件顶部添加 shebang 行,告知操作系统要使用哪个解释器。例如,对于 Python 脚本,您可以添加如下的 shebang 行:

#!/usr/bin/python

关停脚本运行时间

在实例关停或重启之前,关停脚本的运行时间有限。在此期间,Compute Engine 会尝试运行关停脚本。如果完成脚本运行花费的时间超过此时间段,则实例将自动终止并且所有正在运行的任务都将被停止。如果您通过使用 sudo shutdown 命令向访客操作系统发出请求来关停或重启实例,则该限制不适用。

关停期的长度因实例的类型而异。抢占式实例的关停期比普通实例短。如需详细了解每种实例类型的关停时间限制,请参阅关停期

通常,关停脚本必须在关停期内完成运行,使操作系统有时间完成关停过程并清空磁盘的缓冲区。

使用本地关停脚本

本地关停脚本是位于本地计算机上的脚本。 通过以下任意一种方式传递本地关停脚本:作为文件传递或直接将内容提供给 Compute Engine。

关停脚本可以根据需要执行任意数量的操作,但如果您在本地传递文件,则脚本不能超过 256 KB 的元数据值长度限制。要使用超出此长度限制的脚本,请将文件存储在 Cloud Storage 中。如需了解详情,请参阅使用 Cloud Storage 中的关停脚本

提供关停脚本文件

您只能通过 gcloud 命令行工具传递本地关停脚本文件。

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

Terraform

如需直接指定关停脚本,请将 google_compute_instance 资源与元数据中的关停脚本的路径结合使用。

resource "google_compute_instance" "shutdown_content_from_file" {
  name         = "instance-name-shutdown-content-from-file"
  machine_type = "f1-micro"
  zone         = "us-central1-c"
  metadata = {
    # Shuts down Apache server
    shutdown-script = file("${path.module}/shutdown-script.sh")
  }
  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11"
    }
  }
  network_interface {
    # A default network is created for all Google Cloud projects
    network = "default"
    access_config {
    }
  }
}

直接提供关停脚本内容

或者,您可以直接传递关停脚本的内容。

控制台

在 Google Cloud 控制台中,直接使用 shutdown-script 元数据键指定关停脚本:

  1. 转到创建实例页面。

    转到“创建实例”

  2. 指定虚拟机详情。

  3. 展开高级选项部分。

  4. 展开管理,然后执行以下操作:

    1. 元数据部分,点击添加项
    2. 字段中,输入 shutdown-script 作为元数据键。
    3. 字段中,添加关停脚本的内容。
  5. 继续虚拟机创建过程。

gcloud

借助 Google Cloud CLI,使用 --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"

Terraform

如需直接指定关停脚本,请将 google_compute_instance 资源与元数据中的关停脚本结合使用。

resource "google_compute_instance" "default" {
  name         = "instance-name-shutdown-content-directly"
  machine_type = "f1-micro"
  zone         = "us-central1-c"
  metadata = {
    # Shuts down Apache server
    shutdown-script = "#! /bin/bash /etc/init.d/apache2 stop"
  }
  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11"
    }
  }
  network_interface {
    # A default network is created for all Google Cloud projects
    network = "default"
    access_config {
    }
  }
}

REST

在 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:使用此键直接提供关停脚本内容。借助 Google Cloud CLI,您可以使用 --metadata-from-file 标志和 shutdown-script 元数据键提供关停脚本文件的路径。
  • shutdown-script-url:使用此键提供关停脚本文件的 Cloud Storage 网址。

查看关停脚本的输出

Linux

您可以通过执行以下任一操作来查看 Linux 关停脚本的输出:

Windows

使用以下任一项并检查是否有 GCEMetadataScripts 事件,查看 Windows Server 关停脚本的输出: