运行关闭脚本

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

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

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

准备工作

执行此任务所需的权限

要执行此任务,您必须具有以下权限

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

规范

限制

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

  • 实例停止之前会留出一段限定的时间,以允许关闭脚本完成运行:
    • 按需实例:停止或删除实例后 90 秒
    • 抢占式实例:实例抢占开始后 30 秒
  • Compute Engine 仅保证尽量执行关闭脚本。在极少数情况下,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 脚本,请在文件顶部添加 shebang 行,告知操作系统要使用哪个解释器。例如,对于 Python 脚本,您可以添加如下的 shebang 行:

#!/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

直接提供关闭脚本内容

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

Console

在 GCP Console 中,直接使用 shutdown-script 元数据键指定关闭脚本:

  1. 在 GCP Console 中,转到虚拟机实例页面。

    转到“虚拟机实例”页面

  2. 点击创建实例
  3. 创建新实例页面上,填写实例的属性。 对于高级配置选项,展开管理、安全、磁盘、网络、单独租用部分。
  4. 元数据部分中,填入 shutdown-script 作为元数据键。
  5. 框中,提供关闭脚本的内容。
  6. 点击创建以创建实例。

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 文档